首页 > 解决方案 > 用另一个对象替换一个对象的一部分

问题描述

我有一个对象列表,其中每个对象都有许多属性(键值对)。

我们将在很多情况下,不同的 API 调用或服务器发送事件(通过 websockets)将返回数据以更新列表中的某些对象。困难的是每个不同的调用将只返回每个对象的部分数据,而不是完整的数据。

问题是关于仅替换已更改位的最有效方法 - 注意此数据用于 React 应用程序,因此我们还需要考虑不可变的后果。

我的想法只是id将原始数据中的 与新数据相匹配,然后我必须遍历传入的数据以找到键,然后用该键替换原始数据。似乎有一种更有效的方法可以做到这一点。

let original_data = [{
    id: 1,
    value_1: 'will only change when value_1 method is called for id=1',
    value_2: 'will only change when value_2 method is called',
  },
  {
    id: 2,
    value_1: 'will only change when value_1 method is called for id=2',
    value_2: 'will only change when value_2 method is called',
  },
]

let replacement_data = [{
  id: 1,
  value_1: 'assume value_1 method was called for id=1',
}]

for (let i in replacement_data) {
  //get the index matched by id
  index = original_data.findIndex((x => x.id === replacement_data[i].id))

  //replace only the data that has changed
  for (var key in replacement_data[i]) {
    original_data[index][key] = replacement_data[i][key]
  }
}

console.log(original_data);

这确实有效,但是如果我有一个事件发生了几千个这样的变化,它会很慢吗?有没有更好的方法来提高效率,或者我应该采用的最佳实践方法?

标签: javascript

解决方案


如果你使用的是键值对和 ES6,你可以使用https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map类型,免费获得一堆操作。您将需要稍微调整您的数据,或者只是创建某种循环将它们插入到地图中Map()

let original_data = new Map();
original_data.set(1, {
    id: 1,
    value_1: 'will only change when value_1 method is called for id=1',
    value_2: 'will only change when value_2 method is called',
  });
original_data.set(2, {
  {
    id: 2,
    value_1: 'will only change when value_1 method is called for id=2',
    value_2: 'will only change when value_2 method is called',
  });

然后你可以只使用Map.set来更新特定的数据:

let replacement_data = [{
  id: 1,
  value_1: 'assume value_1 method was called for id=1',
}];
for(const data of replacement_data){
  original_data.set(data.id, data);
}

推荐阅读