web-dev-qa-db-fra.com

Tableau d'objets JSON dans un tableau rechercher 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"
         }
    ]
}

];

J'ai une nouvelle valeur disponible de "nom" pour un "id" spécifique. Comment remplacer "nom" d'un "id" spécifique dans un objet? 

Et comment compter le nombre total de groupes parmi tous les objets?

par exemple: remplacez le nom pour "tester grp45" par id = "test1"

Voici le violon http://jsfiddle.net/qLTB7/21/

7
surfnerd

La fonction suivante recherchera dans un objet et dans tous ses objets/tableaux enfants et remplacera la clé par la nouvelle valeur. Il s'appliquera globalement, pour ne pas s'arrêter après le premier remplacement. Décommentez la ligne commentée pour qu'il en soit ainsi.

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

Working jsfiddle: http://jsfiddle.net/qLTB7/28/

14
PitaJ

Essaye ça

function findAndReplace(object,keyvalue, name) {
    object.map(function (a) {
        if (a.groups[0].id == keyvalue) {
            a.groups[0].name = name
        }
    })
}

findAndReplace(myObject,"test1" ,"test grp45");
1
Manjesh V

Voici une approche différente en utilisant Array.prototype.some . Il suppose que la propriété Nom des objets extérieurs doit être réellement nom (mise en majuscule de la note).

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

L'avantage de some est qu'il s'arrête dès que le rappel retourne à true.

1
RobG

Peut-être un sol'n plus succinct

function changeName(objArray, objId, newName) {
    objArray.forEach(function(obj) {
        if (obj.id === objId) obj.Name = newName;
    });
}

Personnellement : si c'était moi, lors de la création de ces objets, je créerais un nouvel obj et les entrerais par identifiant.

 var myApps = {};
 myObject.forEach(function(o) {
     myApps[o.id] = o;
 });

=>
{
    "1": {
        "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"
            }
        ]
    }
}

Et alors vous pourriez juste faire:

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

Découvrez-le ici: Http://jsfiddle.net/qLTB7/40/

0
Todd

cela devrait être if (objet ["id"] == valeur) au lieu de if (objet [x] == valeur) dans la 7ème ligne de la réponse PitaJ, ainsi toute la fonction ressemblera à:

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

si vous quittez objet [x] - la fonction remplacera name également pour les objets avec d'autres valeurs de clé définies sur "test1", par exemple {"id": "xxx", "name": "groupe de test 1" , "desc": "test1" }

0
szymEk

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
Mritunjay