我正在我的应用程序中创建一个类似于 Reddit 的投票系统。每个对象(线程)都有一个 score 属性和一个类似于父对象的对象数组(将其视为对线程的注释)。
这是一个简化的示例:
{
id: '123fdx12c1',
author: 'Anon',
score: 1,
users: [
{
id: '321fdx12c1',
name: 'anon',
score: 1
},
{
id: 'asd123f1fd1',
name: 'anon',
score: 1
}
]
}
现在想象一下像这样的一大堆对象。每当用户投票时,都会派发具有适当 ID 的操作来查找匹配的 ID 并更改分值。
我的做法:
case 'VOTE':
return state.map((question) => {
question.users = question.users.map((user) => {
if (user.id == action.id) {
return {
...user,
voteStatus: action.voteStatus,
score: action.score
}
}
return user;
});
if (question.id == action.id) {
return {
...question,
voteStatus: action.voteStatus,
score: action.score
}
}
return question;
});
它映射整个数组只是为了改变一个对象的一个属性。有没有更快的方法?
最佳答案
最快的是 id 查找,因此即使对于很多 id,通过 id 查找项目几乎是相同的恒定时间:
{
'123fdx12c1' : {
author: 'Anon',
score: 1,
users: [ '321fdx12c1', 'asd123f1fd1' ]
},
'321fdx12c1' : {
name: 'anon',
score: 1
},
'asd123f1fd1' : {
name: 'anon',
score: 1
}
}
附带说明一下,一般情况下,解释型语言中的函数调用比本地代码慢。
在某些浏览器中,.map
可能比 for 循环慢 10-100 倍。
关于javascript - 在大量对象中改变单个对象属性的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46268564/