Javascript создать массив из существующего разделения на значение свойства

1

Я пытаюсь перебрать существующий массив с объектами с свойством "количество" и перестроить его с помощью контрольного значения.

let cart = [{id: 1, name: 'Pizza', quantity: 5, specialId: 0},
            {id: 2, name: 'Burger', quantity: 2, specialId: 0}];

У меня есть контроль над 3-мя статьями, т.е. Для каждых 3 предметов вы получаете скидку, поэтому я хотел бы восстановить массив корзины следующим образом:

cart = [{id: 1, name: 'Pizza', quantity: 3, specialId: 1}, 
        {id: 2, name: 'Pizza', quantity: 2, specialId: 2},
        {id: 3, name: 'Burger', quantity: 1, specialId: 2},
        {id: 4, name: 'Burger', qty: 1, specialId: 0}]

Я рассмотрел несколько способов сделать это в основном вокруг создания нового массива отдельных элементов количества, а затем создания другого финального массива, но, конечно, это не очень эффективно?

Я был бы признателен за любые указания. У меня ужасное чувство, что я пропустил что-то простое и слишком долго смотрел на это.

  • 4
    Почему бургер разделен на две записи, если его количество всего 2?
  • 1
    также может ли начальная корзина содержать вторую запись с Pizza ?
Показать ещё 8 комментариев
Теги:
arrays

2 ответа

2
Лучший ответ

Если я правильно понимаю, количество трех не знает тип продукта, поэтому вторая партия из трех (в вашем примере) состоит из 2 пицц и 1 бургер.

specialId кажется уникальным и ненулевым для каждого полного набора из трех (где каждый элемент в этом наборе имеет значение specialId) и ноль для любого оставшегося элемента (ов).

Наконец, кажется, что id в результате не связан с входом, а просто инкрементным числом.

Вот как вы могли это сделать:

function splitBy(cart, size) {
    const result = [];
    let quantity = 0;
    let grab = size;
    let specialId = 1;
    let id = 1;
    for (let item of cart) {
        for (quantity = item.quantity; quantity >= grab; quantity -= grab, grab = size, specialId++) {
            if (result.length && !result[result.length-1].specialId) result[result.length-1].specialId = specialId;
            result.push(Object.assign({}, item, {quantity: grab, specialId, id: id++}));
        }
        if (quantity) result.push(Object.assign({}, item, {quantity, specialId: 0, id: id++}));
        grab = size - quantity;
    }
    return result;
}

const cart = [{id: 1, name: 'Pizza', quantity: 5, specialId: 0},
              {id: 2, name: 'Burger', quantity: 2, specialId: 0}];
const result = splitBy(cart, 3)

console.log(result);
  • 0
    Благодарю. Это довольно умно и быстро. // Приписывается @trincot
0

В принципе у вас есть два варианта.

  1. петля над текущей cart, и если количество превышает 3, разделите его на два и нажмите на них обоих.
  2. разделите массив, а затем объедините его вместе.

Я предполагаю, что нужно сделать первый вариант, сделав что-то вроде этого:

var cart = [{id: 1, name: 'Pizza', quantity: 5, specialId: 0},
    {id: 2, name: 'Burger', quantity: 2, specialId: 0}];
var a = [];

cart.forEach(x => {
 if (x.quantity > 3) {
    let temp = {...x};
    temp.quantity = 3;
    a.push(temp);
    x.quantity -= 3;
  }
  a.push(x)
});
  • 0
    Благодарю. Это интересный указатель, но он не сработает, так как приведет к неправильным количествам, т.е. Pizza 3, Pizza 2, Burger 2
  • 0
    Извините, я не правильно понял ваш вопрос, я предположил, что ваше условие на скидку 3 из того же продукта. Если это не должен быть тот же продукт, просто измените условие if на счетчик, который сбрасывается, когда он достигает 3, а затем отправляет результат в массив.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню