如何合并和匹配2个单独的对象?

时间:2019-07-02 19:41:54

标签: javascript join javascript-objects array-merge

我想要的

我有 2个不同的Java脚本数组/对象,但是具有匹配的ID 。我想将它们合并为一个新对象。因此,主要对象数据和次要对象中的任何匹配元素都将合并为合并结果。

我尝试过的

我尝试使用Object.assign()函数,但没有成功。

输入信息

示例代码,所以我有2个单独的对象( main lines ):

let main = [
    {
        "Id": "1",
        "Name": "Testing data"
    }
]

let lines = [
    {
        "OtherId": "1",
        "code": "AU-29830"
    },
    {
        "OtherId": "1",
        "code": "AU-29854-Single"
    },
    {
        "OtherId": "1",
        "code": "TV-BB21084623"
    },
    {
        "OtherId": "2",
        "code": "Don't Merge"
    },
    {
        "OtherId": "3",
        "code": "Don't Merge"
    }
]

预期产量

我想合并这两个数组,以便输出应为包含合并 主对象单个数组。此合并的主要对象应该包含其自身的原始内容,并嵌套过滤的 次要数组(仅包含匹配对象 >)。过滤是通过主数组对象的 id 完成的,该对象必须与的每个对象相匹配(稍有偏离 id) >第二数组

结果数组应如下所示:

let result = [
   {
        "Id": "1",
        "Name": "Testing data",
        "lines": [
            {
                "OtherId": "1",
                "ProductCode": "AU-29830"
            },
            {
                "OtherId": "1",
                "ProductCode": "AU-29854-Single"
            },
            {
                "OtherId": "1",
                "ProductCode": "TV-BB21084623"
            }
        ]
    }
]

2 个答案:

答案 0 :(得分:1)

由于您的main是一个数组,所以我假设您最终可能会在其中包含多个主要项目。如果是这样,这是将line个项目合并到每个项目中的一种方法:

const mergedMainItems = 
    main.map(mainItem=>({
        ...mainItem, 
        lines: lines.filter(line=>mainItem["Id"] === line["OtherId"])
    }))

答案 1 :(得分:0)

我认为在此示例中,它将起作用:

let result = [];
result.push({...main[0]}); //or even result.push(main[0])
result[0].lines = [];
for(let l in lines){
  if(lines[l].code != "Don't Merge"){
    result[0].lines.push({OtherId: lines[l].OtherId, ProductCode: lines[l].code})
  }
}