web-dev-qa-db-fra.com

Comment puis-je mettre à jour une ligne dans un tableau javascript en fonction d'une valeur de clé?

J'ai un tableau de données comme celui-ci:

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 celui-ci:

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

Existe-t-il un moyen simple de mettre à jour la variable nameInfo. La clé entre ceux-ci est la colonne du nom. Je sais qu'il existe un moyen de le faire en recherchant la ligne, en la supprimant et en l'ajoutant, mais j'aimerais avoir un moyen de le faire lorsque j'ai mis à jour la ligne. Notez que si cela peut aider, j'ai underscore.js chargé.

19
user1464139

Le moyen le plus simple consiste à faire une 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;
    }
}

Exemple JSFiddle

En utilisant le soulignement, vous pouvez utiliser la méthode _. Find pour effectuer les opérations suivantes au lieu de la boucle for:

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

Exemple JSFiddle

26
Richard Dalton

Edit: Vous pouvez utiliser ES6 filter combiné avec les fonctions fléchées

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

Vous pouvez utiliser _.where fonction

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

puis mettez à jour le match

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

Cela devrait le faire. C'est soigné et fiable et avec un soulignement

6
Uneeb Khan

En utilisant 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
Thram Cortapapel

Vous pouvez utiliser findWhere et étendre

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

Vous pouvez utiliser la méthode _.find, 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 de travail: http://jsfiddle.net/9C2u3/

1
fegemo

Une fonction simple utilisant 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;

Remarque: S'il existe plusieurs objets Moroni, _.find ne peut récupérer que la première correspondance.

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