Я пытаюсь перебрать существующий массив с объектами с свойством "количество" и перестроить его с помощью контрольного значения.
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}]
Я рассмотрел несколько способов сделать это в основном вокруг создания нового массива отдельных элементов количества, а затем создания другого финального массива, но, конечно, это не очень эффективно?
Я был бы признателен за любые указания. У меня ужасное чувство, что я пропустил что-то простое и слишком долго смотрел на это.
Если я правильно понимаю, количество трех не знает тип продукта, поэтому вторая партия из трех (в вашем примере) состоит из 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);
В принципе у вас есть два варианта.
cart
, и если количество превышает 3, разделите его на два и нажмите на них обоих.Я предполагаю, что нужно сделать первый вариант, сделав что-то вроде этого:
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)
});
Pizza
?