Цікаво, чи існує простіший метод у lodash для заміни елемента в колекції JavaScript? (Можливий дублікат, але відповіді я там не зрозумів :)
Я переглянув їх документацію, але нічого не міг знайти
Мій код:
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);
}
};
_.findIndex
для сірника.
_.findIndex
замість _.find
цього дозволить вам скинути і друге, _.find
і те _.indexOf
. Ви Перебір масиву 3 рази , коли все , що вам потрібно , це 1.