Comment puis-je mettre à jour une ligne dans un tableau javascript basé sur une valeur clé?

j'ai un tableau de données comme ceci:

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

Si j'ai un objet comme ceci:

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

y a-t-il un moyen simple que je puisse mettre à jour la variable nameInfo. Clé entre celles-ci se trouve la colonne des noms. Je sais qu'il ya une manière que je pourrais faire ceci en cherchant la ligne, en enlevant et en ajoutant mais je voudrais pour avoir un moyen de le faire où j'ai mis à jour la rangée. Notez que si ça peut aider, j'ai un underscore.JS est chargé.

19
demandé sur Aaron Kurtzhals 2013-04-22 17:18:39

8 réponses

la manière la plus simple est de simplement boucler la boucle et trouver celui avec un nom correspondant puis mettre à jour l'âge:

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 Example

en utilisant le trait de soulignement vous pouvez utiliser le _.trouver méthode pour effectuer les opérations suivantes à la place de la boucle for:

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

Jsfiddle Example

26
répondu Richard Dalton 2013-04-22 13:23:54

Edit: Vous pouvez utiliser ES6 filtre combiné avec les fonctions de flèche

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

Vous pouvez utiliser _.where function

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

puis mettre à jour le match

match[0].age = newage
10
répondu Naruto 2017-06-05 15:57:51
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
  }
});

Cela devrait le faire. Il est soigné et fiable et avec underscore

6
répondu Uneeb Khan 2014-12-03 09:38:07

utilisation de Underscore vous pouvez utiliser _.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
répondu Thram Cortapapel 2013-09-25 05:16:41

Vous pouvez utiliser findWhere et extend

obj = _.findWhere(@songs, {id: id})
_.extend(obj, {name:'foo', age:12});
4
répondu Ali 2015-07-07 18:18:44

Vous pouvez utiliser le _.trouver la méthode, comme ceci:

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

exemple pratique:http://jsfiddle.net/9C2u3/

1
répondu fegemo 2013-04-22 13:29:26
var match = _.findWhere(nameInfo , {name  :nametofind });
match.age = newage
1
répondu venkatareddy 2014-11-10 16:33:49

Un straight forward à l'aide de lodash find () fonction

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;

Note: S'il y a plusieurs objets Moroni, _.find peut aller chercher la première correspondance seulement.

1
répondu j1s 2016-06-08 16:24:39