Подтвердить что ты не робот

Как я могу обновить строку в массиве 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.

4b9b3361

Ответ 1

Самый простой способ - просто перебрать цикл и найти тот, у кого есть соответствующее имя, а затем обновить возраст:

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

Используя подчеркивание, вы можете использовать метод _. find для выполнения следующих действий вместо цикла for:

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

Пример JSFiddle

Ответ 2

Edit: Вы можете использовать ES6 фильтр в сочетании со стрелочными функциями

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

Вы можете использовать функцию _.where

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

затем обновите соответствие

match[0].age = newage

Ответ 3

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
  }
});

Это должно сделать это. Он аккуратный и надежный и с подчеркиванием

Ответ 4

Используя Underscore вы можете использовать _.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."}

Ответ 5

Вы можете использовать findWhere и расширить

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

Ответ 6

Вы можете использовать метод _.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/

Ответ 7

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

Ответ 8

Взгляд вперед с использованием 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 может получить только первое совпадение.