合并两个数组并就地修改它们 (javascript)

Row*_*anX 2 javascript arrays javascript-objects reactjs

我有两个对象数组,原始数组和选定数组,如下所示:

original =[{ id: 4 , quantity: 4 },{ id: 2 , quantity: 2 },{ id: 76 , quantity: 2 }]
selected = [{ id: 2 , quantity: 1 }, { id: 100 , quantity: 7 }]
Run Code Online (Sandbox Code Playgroud)

我希望能够合并 id 上的这些数组,如果它们有相似的 id,我应该总结数量,

在这种情况下,生成的数组应如下所示:

result=[{ id: 4 , quantity: 4 },{ id: 2 , quantity: 3 },{ id: 76 , quantity: 2 } , { id: 100 , quantity: 7 }]
Run Code Online (Sandbox Code Playgroud)

我想做这样的事情:

 const result =original.map(o => ({
            ...selectedArray.findIndex((s) => {(s.id === o.id) && selected)? return }
            ...original
         }));
Run Code Online (Sandbox Code Playgroud)

但我不确定应该如何增加数量,任何需要研究的帮助或资源将不胜感激。

Nin*_*olz 5

您可以找到该对象并更新quantity或推送新对象。

const 
    original = [{ id: 4, quantity: 4 }, { id: 2, quantity: 2 }, { id: 76, quantity: 2 }],
    selected = [{ id: 2, quantity: 1 }, { id: 100, quantity: 7 }],
    merged = [...original, ...selected].reduce((r, { id, quantity }) => {
        const item = r.find(q => q.id === id);
        if (item) item.quantity += quantity;
        else r.push({ id, quantity });
        return r;
    }, []);

console.log(merged);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)

带有哈希表的解决方案。

const 
    mergeTo = (target, reference = {}) => ({ id, quantity }) => {
        if (reference[id]) reference[id].quantity += quantity;
        else target.push(reference[id] = { id, quantity });
    },
    original = [{ id: 4, quantity: 4 }, { id: 2, quantity: 2 }, { id: 76, quantity: 2 }],
    selected = [{ id: 2, quantity: 1 }, { id: 100, quantity: 7 }],
    merged = [],
    merge = mergeTo(merged);


original.forEach(merge);
selected.forEach(merge);

console.log(merged);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)

  • 第二个具有更好的性能,因为 O(1) 访问对象而不用 O(n) 在数组中查找。 (2认同)