我想知道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);
}
};
最佳答案
在您的情况下,您所需要做的就是在数组中找到对象并使用Array.prototype.splice()
方法,阅读更多详细信息here:
var arr = [{id: 1, name: "Person 1"}, {id:2, name:"Person 2"}];
// Find item index using _.findIndex (thanks @AJ Richardson for comment)
var index = _.findIndex(arr, {id: 1});
// Replace item at index using native splice
arr.splice(index, 1, {id: 100, name: 'New object.'});
// "console.log" result
document.write(JSON.stringify( arr ));
<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.min.js"></script>