通过键合并带下划线的数组

时间:2018-10-22 16:14:43

标签: javascript underscore.js

我有2个数组:

[{id:1,name:"name"},{id:2,name:"name2"} ,{id:3,name:"name3"}]

[{id:1,date:"123"},{id:2,date:"456"}]

仅当id相等时才应更新数组1: 所以数组1看起来像

它不应该创建一个新数组。仅基于数组2更新数组1

[{id:1,name:"name",date:"123"},{id:2,name:"name2",date:"456"} ,{id:3,name:"name3"}]

我设法通过array2上的for循环并在for过滤器内执行以下操作:

._filter(array1,function(item){
 If(item.id=array2.id)
    Do smth and update the array1.date
})

我该如何以最好的方式做到这一点?使用underscore.js

6 个答案:

答案 0 :(得分:0)

您可以使用以下本地语言来做到这一点:

const arr1 = [{id:1,name:"name"},{id:2,name:"name2"} ,{id:3,name:"name3"}];
const arr2 = [{id:1,date:"123"},{id:2,date:"456"}];

arr1.forEach((ele) => {
   const match = arr2.find(item => ele.id === item.id) || {};   
   Object.assign(ele, match);
});

console.log(arr1);

答案 1 :(得分:0)

您可以执行以下操作:

使用some()方法遍历array1并检查array2中每个项目的ID是否存在。

var arr1 = [{id:1,name:"name"},{id:2,name:"name2"} ,{id:3,name:"name3"}];
var arr2 = [{id:1,date:"123"},{id:2,date:"456"}];

var missing = [];

arr1.forEach( (item1, i) => {
  var isExist = arr2.some(item2 => item2.id === item1.id)
  
  if(!isExist) {
    missing.push(i);
  }
	
})

missing.forEach(item => {
	arr2.push(arr1[item]);
})

console.log(arr2);

some()的参考

答案 2 :(得分:0)

尝试一下:

var a = [{id:1,name:"name"},{id:2,name:"name2"} ,{id:3,name:"name3"}] ;
var b = [{id:1,date:"123"},{id:2,date:"456"}] ;
var i = 0, j = 0 ;

while( i < a.length ) {
  j = 0 ;
  while( j < b.length) {
    if ( a[i].id === b[j].id )
      Object.assign( a[i] , b[j] );
    j++; 
  }
  i++;
}

console.log(a) ;

答案 3 :(得分:0)

您可以使用forEach遍历第二个数组,并使用findIndex从第一个数组中获取匹配的元素。如果id匹配,则更新第一个数组中的对象

let arr1 = [{
  id: 1,
  name: "name"
}, {
  id: 2,
  name: "name2"
}, {
  id: 3,
  name: "name3"
}]
let arr2 = [{
  id: 1,
  date: "123"
}, {
  id: 2,
  date: "456"
}]

arr2.forEach(function(acc) {
  let findArry1Index = arr1.findIndex(function(item) {
    return item.id === acc.id;
  });
  if (findArry1Index !== -1) {
    arr1[findArry1Index].date = acc.date;
  }
});

console.log(arr1)

答案 4 :(得分:0)

var a = [{id:1,name:"name"},{id:2,name:"name2"} ,{id:3,name:"name3"}];

var b = [{id:1,date:"123"},{id:2,date:"456"}];

a = _.map(a, function(e) { return _.extend(e, _.findWhere(b, {id: e.id})); });

a导致:

0: {id: 1, name: "name", date: "123"}
1: {id: 2, name: "name2", date: "456"}
2: {id: 3, name: "name3"}

但是,我想这符合“创建新数组”的条件吗?也许可以作为¯\ _(ツ)_ /¯

的灵感

答案 5 :(得分:-1)

您可以使用下划线的indexBy函数以id来索引第二个数组,然后只需使用Object.assign(...)通过在第一个数组的元素中执行查找来更新第一个数组的元素及其对应的匹配项。索引元素对象。

let arr1 = [{id:1, name:"name"}, {id:2, name:"name2"}, {id:3, name:"name3"}]
let arr2 = [{id:1, date:"123"}, {id:2, date:"456"}]

const arr2Groups = _.indexBy(arr2, e => e.id);

arr1.forEach(e => Object.assign(e, arr2Groups[e.id] || {}));
console.log(arr1);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>