【发布时间】:2015-02-22 20:33:56
【问题描述】:
我想知道 lodash 中是否有更简单的方法来替换 JavaScript 集合中的项目? (可能duplicate 但我不明白那里的答案:)
我查看了他们的文档,但找不到任何东西
我的代码是:
var arr = [{id: 1, name: "Person 1"}, {id:2, name:"Person 2"}];
// Can following code be reduced to something like _.XX(arr, {id:1}, {id:1, name: "New Name"});
_.each(arr, function(a, idx){
if(a.id === 1){
arr[idx] = {id:1, name: "Person New Name"};
return false;
}
});
_.each(arr, function(a){
document.write(a.name);
});
更新: 我试图替换的对象有很多属性,比如
{id: 1, Prop1: ..., Prop2:..., 等等}
解决方案:
感谢dfsq,但我在 lodash 中找到了一个合适的解决方案,它似乎工作正常并且非常整洁,我也将它放在一个 mixin 中,因为我在很多地方都有这个要求。 JSBin
var update = function(arr, key, newval) {
var match = _.find(arr, key);
if(match)
_.merge(match, newval);
else
arr.push(newval);
};
_.mixin({ '$update': update });
var arr = [{id: 1, name: "Person 1"}, {id:2, name:"Person 2"}];
_.$update(arr, {id:1}, {id:1, name: "New Val"});
document.write(JSON.stringify(arr));
更快的解决方案 正如@dfsq 所指出的,以下速度更快
var upsert = function (arr, key, newval) {
var match = _.find(arr, key);
if(match){
var index = _.indexOf(arr, _.find(arr, key));
arr.splice(index, 1, newval);
} else {
arr.push(newval);
}
};
【问题讨论】:
-
我认为您也可以在“更快的解决方案”的第 4 行使用 match 作为 _.indexOf 的第二个参数,无需在那里重新计算该值,这应该会使事情变得更快。
-
更快:使用
_.findIndex进行匹配。 -
只是为了扩展@JulianK 和@davertron 所说的内容,使用
_.findIndex而不是_.find将让您放弃第二个_.find和_.indexOf。当您只需要 1 次时,您将遍历数组 3 次。
标签: javascript lodash