J'ai un objet JSON comme celui-ci:
var myObject = [ { "Name" : "app1", "id" : "1", "groups" : [ { "id" : "test1", "name" : "test group 1", "desc" : "this is a test group" }, { "id" : "test2", "name" : "test group 2", "desc" : "this is another test group" } ] }, { "Name" : "app2", "id" : "2", "groups" : [ { "id" : "test3", "name" : "test group 4", "desc" : "this is a test group" }, { "id" : "test4", "name" : "test group 4", "desc" : "this is another test group" } ] }, { "Name" : "app3", "id" : "3", "groups" : [ { "id" : "test5", "name" : "test group 5", "desc" : "this is a test group" }, { "id" : "test6", "name" : "test group 6", "desc" : "this is another test group" } ] } ];
6 Réponses :
La fonction suivante recherchera via un objet et tous ses objets / matrices d'enfant et remplacera la clé avec la nouvelle valeur. Il appliquera globalement, de sorte que cela ne s'arrête pas après le premier remplacement. Définissez la ligne commentée pour en faire de cette façon.
function findAndReplace(object, value, replacevalue) { for (var x in object) { if (object.hasOwnProperty(x)) { if (typeof object[x] == 'object') { findAndReplace(object[x], value, replacevalue); } if (object[x] == value) { object["name"] = replacevalue; // break; // uncomment to stop after first replacement } } } }
Au lieu de Break i>, vous pourriez utiliser Retour i> pour le rendre plus évident qu'il s'y arrête. En outre, typeof objet [x] == typeof {} code> est très inefficace (cela crée un nouvel objet à chaque fois), utilisez
typeof objet [x] == 'objet' code> . Il faut également inclure un test HASOWNPROPERTY i>, vous ne voulez pas vérifier les propriétés immatures héritées.
@Robg - J'ai écrit ce problème rapidement. Je vais ajouter ces changements.
Essayez ceci
Merci Manjesh. Pitaj suggère exactement la même chose. Travaillé !
Je pense que cela devrait fonctionner pour vous: -
var id = 'test1'; var newname = 'test grp45'; var numberOfGruops = 0; myObject.forEach(function(app){ numberOfGruops += app.groups.length; //Count all groups in this app app.groups.forEach(function(group){ if(group.id===id) group.name = newname; // replace the name }); });
peut-être un Sol'n plus succinct strong> myApps['someId'].name = 'This is my new Name'
Salut Todd..mak Vous pour les commentaires..nous pouvons directement faire la même chose avec objet [0], objet [1] non?
Cela ne fonctionne que pour les objets dans la première matrice, il ne se recueille pas dans les objets du tableau Groupes i>. Il continue également de boucler, même après avoir été trouvée.
@vkiiz Oui, nous pourrions le faire de manière itérative, comme vous décrivez. Je pensais que vous recherchiez simplement un moyen de sélectionner un objet par son identifiant, puis modifiez la propriété Nom.
@ROBG, merci d'avoir souligné que la boucle n'est cassée avant que tous les Objs soient vérifiés. Sur une note différente, je n'ai pas compris que le changement de nom "profond" était nécessaire.
@ Todd-the op dit "Comment puis-je remplacer" nom "de" ID "spécifique à l'intérieur tout i> b> objet", donc j'ai supposé que cela pourrait être à n'importe quel niveau. Je serais peut-être faux, seul l'OP sait. :-)
@Robg, j'apprécie votre attention aux détails. Continuez à faire si un meilleur endroit!
Voici une approche différente en utilisant array.pototype.some em> . Il suppose que la propriété nom em> dans les objets extérieurs doit être effectivement nom em> (note capitalisation). function updateNameById(obj, id, value) {
Object.keys(obj).some(function(key) {
if (obj[key].id == id) {
obj[key].name = value;
return true; // Stops looping
}
// Recurse over lower objects
else if (obj[key].groups) {
return updateNameById(obj[key].groups, id, value);
}
})
}
Il devrait être p> function findAndReplace(object, value, replacevalue) {
for (var x in object) {
if (object.hasOwnProperty(x)) {
if (typeof object[x] == 'object') {
findAndReplace(object[x], value, replacevalue);
}
if (object["id"] == value) {
object["name"] = replacevalue;
// break; // uncomment to stop after first replacement
}
}
}
}
Dupliqué possible de Objets d'accès / processus (imbriqué), tableaux ou JSON
Ce n'est pas un objet JSON, c'est juste un objet JavaScript.
Oui. Mon erreur !. C'est un objet JS. Merci quand même.
@ Zerkms- * MyObject * est un tableau (qui, qui, a accordé, est un type particulier d'objet). ;-)
Dans l'objet extérieur, vous avez "NOM", les objets intérieurs que vous avez "NOM", c'est que cela devrait être?