1. ホーム
  2. javascript

[解決済み] 一致した項目を置き換える関数はありますか?

2022-02-14 23:06:54

質問

JavaScriptのコレクションでアイテムを置き換えるために、lodashでもっと簡単な方法はないでしょうか?(可能な限り 複製 が、そこの回答は分かりませんでした:)

私は彼らのドキュメントを見たが、何も見つからなかった

私のコードは

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: ..., and so on}のように。

解決策

ご協力ありがとうございました。 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);
    }
};

解決方法は?

この場合、必要なのは配列からオブジェクトを見つけて Array.prototype.splice() メソッドがあります。 ここで :

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>