我试图使用具有“ quantity”属性的对象遍历现有数组,并通过控制值对其进行重建。
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);
关于javascript - Javascript根据属性值的现有拆分创建数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52950596/