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é.
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;
}
}
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;
}
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
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
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."}
Vous pouvez utiliser findWhere et extend
obj = _.findWhere(@songs, {id: id})
_.extend(obj, {name:'foo', age:12});
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/
var match = _.findWhere(nameInfo , {name :nametofind });
match.age = newage
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.