webentwicklung-frage-antwort-db.com.de

JSON-Objektarray innerhalb des Arrays in Javascript suchen und ersetzen

Ich habe ein JSON-Objekt wie dieses:

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

];

Ich habe einen neuen Wert für "Name" für bestimmte "ID". Wie kann ich "Name" einer bestimmten "ID" in einem Objekt ersetzen? 

Und wie zählt man die Gesamtzahl der Gruppen unter allen Objekten?

beispiel: Ersetzen Sie den Namen in "test grp45" für id = "test1".

Hier ist Geige http://jsfiddle.net/qLTB7/21/

7
surfnerd

Die folgende Funktion durchsucht ein Objekt und alle untergeordneten Objekte/Arrays und ersetzt den Schlüssel durch den neuen Wert. Es gilt global, damit es nach dem ersten Austausch nicht aufhört. Kommentieren Sie die kommentierte Zeile, um sie so zu machen.

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

Jsfiddle arbeiten: http://jsfiddle.net/qLTB7/28/

14
PitaJ

Versuche dies

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

Hier ist ein anderer Ansatz mit Array.prototype.some . Es wird davon ausgegangen, dass die Eigenschaft Name in den äußeren Objekten tatsächlich name sein sollte (Anmerkung Großschreibung beachten).

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

Der Vorteil von some ist, dass es stoppt, sobald der Rückruf true zurückgibt.

1
RobG

Vielleicht ein prägnanteres sol'n

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

Persönlich : Wenn ich das wäre, würde ich beim Erstellen dieser Objekte ein neues Objekt erstellen und sie mit der ID eingeben.

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

Und dann könntest du einfach folgendes tun:

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

Schau es dir hier an: Http://jsfiddle.net/qLTB7/40/

0
Todd

es sollte if (object ["id"] == value) anstelle von if (object [x] == value) in der 7. Zeile der PitaJ-Antwort sein, so dass die gesamte Funktion wie folgt aussieht:

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

wenn Sie das Objekt [x] verlassen, wird die Funktion den Namen auch für Objekte ersetzen, für die andere Schlüsselwerte auf "test1" gesetzt sind, beispielsweise auf {"id": "xxx", "name": "Testgruppe 1". , "desc": "test1" }

0
szymEk

Ich denke, das sollte für Sie funktionieren: -

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