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

How can I merge and match 2 separate objects?

我想要的

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

我试过的

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

给定输入

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

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"
    }
]

预期输出

我想合并这两个数组,这样输出应该是一个 包含 merged 的单个数组主要对象。这个 merged main-object 应该包含其自身的原始内容加上嵌套的 filtered secondary array (仅包含 匹配对象 )。过滤是使用主数组对象中的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"
            }
        ]
    }
]

我认为对于这个例子这会起作用:

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})
  }
}

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

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