Javascript 当数组包含更新数据时合并数组

Javascript merge arrays when one contains updated data

我有两个这样的对象数组:

var myArray = [
  {pk: '1', person: 'person 1'}, 
  {pk: '2', person: 'someone'}, 
];

var updatedArray = [
  {pk: '2', person: 'another person'}
];

我希望以最有效的方式合并两者。 我的想法是将较旧的 myArray 合并到较新的 updatedArray 中,并删除 myArray.pk == updatedArray.pk

中的任何项目

我在尝试使用 jQuery 或下划线时遇到问题。 我也一直在尝试使用 this one 作为示例。

有什么想法吗?

我认为遍历更新并将其复制到当前值是一个好方法。 如果您只有一个 属性 需要更改,那么就不需要 Object.assign。您可以简单地将其替换为

myArray[idx].name = uv.name

var myArray = [
  {pk: '1', person: 'person 1'}, 
  {pk: '2', person: 'someone'}, 
];

var updatedArray = [
  {pk: '2', person: 'another person'}
];

updatedArray.forEach(uv => {
  var idx = myArray.findIndex(v => v.pk === uv.pk)
  if (idx != -1)
    myArray[idx] = Object.assign({}, myArray[idx], uv);
  else myArray.push(uv);
});

console.log(myArray)

最有效的方法是,首先从其中一个数组创建一个映射。 然后 运行 一个循环并从地图中获取项目

你只需要两个函数,reducemap

这种方式只需要array1.length + array2.length次迭代,不需要array1.length * array2.length

// creates the map
var myMap = myArray.reduce(function(obj, item) {
  obj[item.pk] = item
}, {})

// merges updatedArray items, with the item from the map
var mergedArray = updatedArray.map(function(item) {
   return myMap[item.pk] ? Object.assign({}, myMap[item.pk], item) : item
})

你可以试试

 function mergeArr(arrOne, arrTwo, prop) {
        _.each(arrTwo, function(arrTwoobj) {
            var arrOneobj = _.find(arrOne, function(arrOneobj) {
                return arrOneobj[prop] === arrTwoobj[prop];
            });
            arrOneobj ? _.extend(arrOneobj, arrTwoobj) : arrOne.push(arrTwoobj);
        });
    }

    var myArray = [
      {pk: '1', person: 'person 1'}, 
      {pk: '2', person: 'someone'}, 
    ];

    var updatedArray = [
      {pk: '2', person: 'another person'}
    ];

    mergeArr(myArray, updatedArray, 'pk');
    console.log(myArray);

var myArray = [
  {pk: '1', person: 'person 1'}, 
  {pk: '2', person: 'someone'}, 
];

var updatedArray = [
  {pk: '2', person: 'another person'}
];

var exists = [];
for (item of updatedArray) {
  exists[item.pk] = true;
}
for (item of myArray) {
  if (!exists.hasOwnProperty(item.pk)) {
    updatedArray.push(item);
  }
}

console.log(updatedArray);