javascript - 用另一个对象替换一个对象的一部分
问题描述
我有一个对象列表,其中每个对象都有许多属性(键值对)。
我们将在很多情况下,不同的 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);
这确实有效,但是如果我有一个事件发生了几千个这样的变化,它会很慢吗?有没有更好的方法来提高效率,或者我应该采用的最佳实践方法?
解决方案
如果你使用的是键值对和 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);
}
推荐阅读
- progressive-web-apps - TWA 基础应用程序有时显示 URL,有时工作,甚至 Assetlink.json 正确上传
- python - 如何使用 Postgres 窗口函数或横向连接限制 Django ORM 中每个组的前 N 个?
- php - Twig:如何检查是否有请求?(寻找 symfony 5:app.request)
- javascript - 在多选下拉列表中获取选定值并将它们插入 JSON
- node.js - 实时聊天技术的表现
- swift - 如何从“renderer(_:nodeFor:)”实例方法中捕获节点?
- c# - Azure Functions EventHub 触发器连接字符串
- jenkins - 在使用 curl 的 Jenkins 管道中如何存储响应 cookie?
- dns - 为什么我有一条指向 namecheap 服务器 IP 的 A 记录?
- c# - 如何从事件存储中查询多个聚合?