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