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

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}]

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

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

1
John Sourcer 23 Окт 2018 в 16:40

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);
2
trincot 23 Окт 2018 в 14:16

В основном у вас есть два варианта.

  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
Rabbi Shuki Gur 23 Окт 2018 в 13:54
52950596