Javascript根据属性值的现有拆分创建数组

时间:2018-10-23 13:40:33

标签: javascript arrays

我正在尝试使用具有“ 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 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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)
});