web-dev-qa-db-ja.com

キー値に基づいてJavaScript配列の行を更新するにはどうすればよいですか?

私はこのようなデータの配列を持っています:

var nameInfo  = [{name: "Moroni", age: 50},
                 {name: "Tiancum", age: 43},
                 {name: "Jacob", age: 27},
                 {name: "Nephi", age: 29},
                 {name: "Enos", age: 34}];

このようなオブジェクトがある場合:

var nameInfo  = {name: "Moroni", age: 51};

変数nameInfoを更新する簡単な方法はありますか?これらの間のキーは名前列です。行を検索し、削除して追加することでこれを実行できる方法があることはわかっていますが、行を更新したところでこれを実行する方法が欲しいのですが。それが役立つ場合は、underscore.jsが読み込まれていることに注意してください。

19
user1464139

最も簡単な方法は、ループして名前が一致するものを見つけ、年齢を更新することです。

var newNameInfo  = {name: "Moroni", age: 51};
var name = newNameInfo.name;

for (var i = 0, l = nameInfo.length; i < l; i++) {
    if (nameInfo[i].name === name) {
        nameInfo[i].age = newNameInfo.age;
        break;
    }
}

JSFiddleの例

アンダースコアを使用すると、forループの代わりに _。find メソッドを使用して以下を実行できます。

var match = _.find(nameInfo, function(item) { return item.name === name })
if (match) {
    match.age = newNameInfo.age;
}

JSFiddleの例

26
Richard Dalton

編集: ES6を使用できますフィルター矢印関数と組み合わせて

nameInfo.filter(x => {return x.name === nametofind })[0].age = newage

_.where関数を使用できます

var match = _.where(nameInfo , {name  :nametofind });

次に、試合を更新します

match[0].age = newage
11
Naruto
var nameInfo  = [{name: "Moroni", age: 50},{name: "Tiancum", age: 43},
                 {name: "Jacob", age: 27},{name: "Nephi", age: 29},
                 {name: "Enos", age: 34}
                ];
_.map(nameInfo, function(obj){
  if(obj.name=='Moroni') {
    obj.age=51; // Or replace the whole obj
  }
});

これでうまくいくはずです。端正で信頼性があり、アンダースコア付き

6
Uneeb Khan

アンダースコアを使用すると、_。findWhere http://underscorejs.org/#findWhere を使用できます

_.findWhere(publicServicePulitzers, {newsroom: "The New York Times"});
=> {year: 1918, newsroom: "The New York Times",
  reason: "For its public service in publishing in full so many official reports,
  documents and speeches by European statesmen relating to the progress and
  conduct of the war."}
4

あなたはfindWhereを使用して拡張することができます

obj = _.findWhere(@songs, {id: id})
_.extend(obj, {name:'foo', age:12});
4
Ali

次のように、_。findメソッドを使用できます。

var nameInfos  = [{name: "Moroni", age: 50},
                 {name: "Tiancum", age: 43},
                 {name: "Jacob", age: 27},
                 {name: "Nephi", age: 29},
                 {name: "Enos", age: 34}];
var nameToSearch = "Moroni";
var myRecord = _.find(nameInfos, function(record){ return record.name === nameToSearch; });

作業例: http://jsfiddle.net/9C2u3/

1
fegemo

Lodashの find() 関数を使用した順方向の前進、

var nameInfo  = [{name: "Moroni", age: 50},
             {name: "Tiancum", age: 43},
             {name: "Jacob", age: 27},
             {name: "Nephi", age: 29},
             {name: "Enos", age: 34}];

var objToUpdate = _.find(nameInfo, {name: "Moroni"});

if(objToUpdate) objToUpdate.age = 51;

console.log(nameInfo); // Moroni age will be 51;

注:複数のMoroniオブジェクトがある場合、_。findは最初の一致のみをフェッチできます。

1
j1s
var match = _.findWhere(nameInfo , {name  :nametofind });
match.age = newage
1
venkatareddy