7
votes

Json Object Array Inside Array Trouver et remplacer en JavaScript

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"
         }
    ]
}

];


5 commentaires

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?


6 Réponses :


17
votes

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


2 commentaires

Au lieu de Break , vous pourriez utiliser Retour pour le rendre plus évident qu'il s'y arrête. En outre, typeof objet [x] == typeof {} est très inefficace (cela crée un nouvel objet à chaque fois), utilisez typeof objet [x] == 'objet' . Il faut également inclure un test HASOWNPROPERTY , 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.



1
votes

Essayez ceci xxx


1 commentaires

Merci Manjesh. Pitaj suggère exactement la même chose. Travaillé !



0
votes

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


0 commentaires

0
votes

peut-être un Sol'n plus succinct strong> xxx pré>

personnellement strong>: Si c'était moi, lors de la création de ces objets, je créerais Un nouveau OBJ et les clés par ID. P>

myApps['someId'].name = 'This is my new Name'


6 commentaires

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 . 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 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!



1
votes

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


0 commentaires

0
votes

Il devrait être si (objet ["ID"] == valeur) strong> au lieu de si (objet [x] == valeur) strong> dans la 7ème ligne de réponse pitaj , toutefois une fonction entière ressemblera à:

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


0 commentaires