【问题标题】:Combine two different sized array of objects in javascript [closed]在javascript中组合两个不同大小的对象数组[关闭]
【发布时间】:2018-09-20 09:40:55
【问题描述】:

我有两个像这样大小不同的数组

[{ id: 1, name: 'One', contacts: [] }, 
 { id: 2, name: 'Two', contacts: [] }, 
 { id: 3, name: 'Three', contacts: [] }, 
 { id: 4, name: 'Four', contacts: [] }]

[{ id: 1, name: 'One', contacts: [{ id: 100, name: "C1" }, { id: 101, name: "C2" }] },
 { id: 3, name: 'Three', contacts: [{ id: 120, name: "C1" }, { id: 121, name: "C2" }] },
 { id: 5, name: 'Five', contacts: [{ id: 420, name: "F1" }, { id: 421, name: "F2" }] }];

我在 javascript 中尝试了以下代码

const mergeArray = (source, merge, by) => source.map(item => ({
    ...item,
    ...(merge.find(i => i[by] === item[by]) || {}),
    }));

    output =  mergeArray(this.oldArray1,this.oldArray2,'id');

输出为

[{ id: 1, name: 'One', contacts: [{ id: 100, name: "C1" }, { id: 101, name: "C2" }] }, 
{ id: 2, name: 'Two', contacts: [] }
{ id: 3, name: 'Three', contacts: [{ id: 120, name: "C1" }, { id: 121, name: "C2" }] }]

但是想要这样的输出

[{ id: 1, name: 'One', contacts: [{ id: 100, name: "C1" }, { id: 101, name: "C2" }] }, 
{ id: 2, name: 'Two', contacts: [] }
{ id: 3, name: 'Three', contacts: [{ id: 120, name: "C1" }, { id: 121, name: "C2" }] },
{ id: 4, name: 'Four', contacts: [] }
{ id: 5, name: 'Five', contacts: [{ id: 420, name: "F1" }, { id: 421, name: "F2" }] }]

【问题讨论】:

  • 你有没有尝试过?
  • 抱歉:您的问题是什么:Stack Overflow 不是代码编写服务。我们将帮助调试您的代码。
  • 好的,你的问题是什么?在你说“我该怎么做?”之前你至少应该自己尝试一下。
  • 循环你的对象并执行$.extend({}, obj1.contacts, obj2.contacts)
  • 提示:您可以创建从名称到对象的映射并合并具有相同名称的对象。

标签: javascript ecmascript-6


【解决方案1】:

您可以将数组收集到一个数组中,或者简单地连接数组,然后通过检查 id 是否在结果数组中来减少该数组。如果未将对象添加到结果数组或如果存在,则使用实际数据扩展contacts

var array1 = [{ id: 1, name: 'One', contacts: [] }, { id: 2, name: 'Two', contacts: [] }, { id: 3, name: 'Three', contacts: [] }, { id: 4, name: 'Four', contacts: [] }],
    array2 = [{ id: 1, name: 'One', contacts: [{ id: 100, name: "C1" }, { id: 101, name: "C2" }] }, { id: 3, name: 'Three', contacts: [{ id: 120, name: "C1" }, { id: 121, name: "C2" }] }, { id: 5, name: 'Five', contacts: [{ id: 420, name: "F1" }, { id: 421, name: "F2" }] }],
    merged = [array1, array2].reduce((r, a) => {
        a.forEach(o => {
            var object = r.find(({ id }) => id === o.id);
            if (!object) {
                return r.push(o);
            }
            object.contacts.push(...o.contacts);
        });
        return r;
    }, []);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 2022-01-15
    相关资源
    最近更新 更多