如何合并两个对象数组

Posted

技术标签:

【中文标题】如何合并两个对象数组【英文标题】:How to merge two array of objects 【发布时间】:2013-05-21 19:55:32 【问题描述】:

我有两个对象数组,如下所示:

result = [id:24, name:"xyz", id:45,name:"tze"]
moreDetails = [id:24, name2:"hyi", id:45, name2:"tikw"]

我想要上面这样的合并结果

mergedResult= [id:24, name:"xyz", name2:"hyi", id:45,name:"tze", name2:"tikw"]

请注意合并发生在id,这两个数组都有。

我试着关注这个How to merge these arrays/json objects?和这个How can I merge properties of two javascript objects dynamically?

但是,我想我迷路了,我的问题可能需要一个简短的解决方案。

编辑

我试图简化我的示例。实际上,上述两个数组都只有id 的共同点,它们的名称不止name,name2。例如,有时 result 数组将具有 id, name, name2, name3moreDetails 将具有 id, name, name4 。我想说的是,除了id 之外,我并不总是提前知道这两个数组会有什么。因此,我不能像某些答案所建议的那样对字段名称进行硬编码。

【问题讨论】:

这能回答你的问题吗? Merge two array of objects based on a key 【参考方案1】:

您可以使用for 循环,在这种情况下,扩展一个数组的元素比创建另一个数组更好:

for (var i = 0; i < result.length; i++) 
    result[i].name2 = moreDetails[i].name2;

http://jsfiddle.net/9uchU/

如果目标元素有不同的索引:

for (var i = 0; i < result.length; i++) 
    var c = result[i],
        // filtering the second array based on the `id` 
        // of the current element 
        m = moreDetails.filter(function(elem) 
             return elem.id === c.id;
        )[0];
    c.name2 = m ? m.name2 : 'not defined';

编辑:根据您上次的编辑,正如@Blender 提到的,您还可以使用 jQuery $.extend() 实用函数:

$.extend(result, moreDetails);

【讨论】:

你也可以$.extend(result[i], moreDetails[i]) +1。我要试试这个。顺便说一句,请查看我的编辑问题。 我打算用@Blender 的评论来回答,你应该把它作为答案。另外,我很确定您不需要 [i] 部分,只需 $.extend(arr1, arr2); @Blender $.extend(result[i], moreDetails[i]) 工作。如果您不发表评论作为答案,我将不得不接受这个,非常感谢! @TomFobear it $.extend(result, moreDetails) 没有 [i] 对我不起作用。【参考方案2】:
<html>
<head><title></title>
<script src="http://code.jquery.com/jquery-1.10.0.min.js" ></script>
</head>
<body>

<script>
    function findElement(arr, propName, propValue) 
      for (var i=0; i < arr.length; i++)
        if (arr[i][propName] == propValue)
          return arr[i];
        
      
    

    var result = [id:24, name:"xyz", id:45,name:"tze"];
    var moreDetails= [id:24, name2:"hyi", id:45, name2:"tikw"];
    var mergedResult = result;

    for (var i = 0; i<result.length;i++ ) 
      //mergedResult[i].name2 = findElement(moreDetails, "id", result[i].id).name2
    $.extend(mergedResult[i],findElement(moreDetails, "id", result[i].id));
     

    mergedResult;
</script>
</body>
</html>

【讨论】:

谢谢!请查看我的编辑问题。我提供了更多细节。 为你更新了示例:) 感谢您提供详细的代码示例,我将在获得 15 分后立即给这篇帖子投票 :)

以上是关于如何合并两个对象数组的主要内容,如果未能解决你的问题,请参考以下文章

如何根据javascript中的键合并和替换两个数组中的对象?

如何将不同数组中的两个匹配对象合并为一个对象?

如何将数组的两个对象合并为一个?

js利用Map对两个数组对象进行合并去重

如何将具有相同属性的对象合并到一个数组中?

js 数组对象根据相同value的key合并两个对象