根据键属性合并不是相同长度的哈希数组

时间:2016-06-26 23:25:24

标签: javascript jquery arrays underscore.js

我想使用JS,Underscore或JQuery将2个哈希数组合并为1个新数组。

这两个数组的长度可能不同,合并将基于 id 属性。相同数组之间的散列可能没有相同的ID,例如:

arr1 id' s = [1,5]

arr2 id' s = [1,2]

以下是我的数组:

arr1 = [{
    id: 1
    name: 'fred'
},id: 5
    name: 'alex'
}];

arr2 = [{
    id: 1
    wage: '300'
},{
    id: 2
    wage: '10'
}]

所以基于 id 属性,我应该得到以下内容:

arr3 = [{
    id: 1
    name: 'fred'
    wage: '300'
},{
    id: 2
    wage: '10'
},{
    id: 5
    name: 'alex'
}]

我尝试使用Merging/extend javascript object arrays based on join of a key property in each,但如果数组长度不同,则无法正常工作。有什么帮助吗?

3 个答案:

答案 0 :(得分:2)

您可以使用Object.assign

arr1 = [{ id: 1, name: 'fred' }];

arr2 = [
  { id: 1, wage: '300' }, 
  { id: 2, wage: '10' }
];

var result = [];
arr1.concat(arr2)
  .forEach(item =>
    result[item.id] =
    Object.assign({}, result[item.id], item)
  );
result = result.filter(r => r);
console.log(result)

答案 1 :(得分:1)

修改

如评论中所述,此解决方案不考虑通过ID进行匹配。要查看此操作,只需将{ id:7, name: 'wilma' }添加到第一个数组。

我把它留在这里但是因为从示例数据或描述中不清楚这是OP的关键问题,尽管我也有部分错误。但是我会在那里发表评论,如果他说是我可以编辑或删除它,那么

jQuery.extend()

https://api.jquery.com/jquery.extend/

  

jQuery.extend([deep],target,object1 [,objectN])

传入额外的参数使其成为深度合并,即递归

https://jsfiddle.net/dabros/q0hhqbmf/

arr1 = [{
    id: 1,
    name: 'fred'
}];

arr2 = [{
    id: 1,
    wage: '300'
},{
    id: 2,
    wage: '10'
}]

arr3 = [];

// Use 2 extends, though $.merge(x,$.extend(y,z)) would work just as well in this case
$.extend(arr3, $.extend(true, arr1, arr2 ));

console.log(arr3);

答案 2 :(得分:0)

为什么不只是简单地迭代它们,并收集新数组?



<script src="https://raw.githubusercontent.com/lodash/lodash/4.13.1/dist/lodash.js"></script>
<script>
var arr1 = [
  {
    id: 1,
    name: 'fred'
  },
  {
    id: 5,
    name: 'alex'
  }
];

var arr2 = [
  {
    id: 1,
    wage: '300'
  },
  {
    id: 2,
    wage: '10'
  }
];
  
var a1, a2, arr3 = [], merged = [];
  
// finding intersection and merging
for(a1 = 0; a1 < arr1.length; a1++) {
  for(a2 = 0; a2 < arr2.length; a2++) {
    if(arr1[a1].id === arr2[a2].id) {
      arr3.push(_.extend(arr1[a1], arr2[a2]));
      merged.push(arr1[a1].id);
      break
    }
  }
}

// finding non merged elements and adding
for(a1 = 0; a1 < arr1.length; a1++) {
  if(merged.indexOf(arr1[a1].id) > -1) {
    continue;  
  }
  
  arr3.push(arr1[a1]);
}

// finding non merged elements and adding
for(a2 = 0; a2 < arr2.length; a2++) {
  if(merged.indexOf(arr2[a2].id) > -1) {
    continue; 
  }
  
  arr3.push(arr2[a2]);
}

document.write(JSON.stringify(arr3));
</script>
&#13;
&#13;
&#13;