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内で適切に機能するように見える適切なソリューションが見つかりました。これは、多くの場所でこの要件があるため、ミックスインにも入れました。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
を使用すると、2番目_.find
との両方をドロップできます_.indexOf
。あなたが必要とするすべてが1のときには、配列を3回反復している