Массив объектов JSON внутри массива найти и заменить в javascript

У меня есть один объект JSON, как это:

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

];

У меня есть новое значение " name "для конкретного"id". Как я могу заменить" имя "конкретного" id " внутри любого объекта ?

и как подсчитать общее количество групп среди всех объектов ?

например: замените имя на "test grp45" для id = "test1"

вот скрипку http://jsfiddle.net/qLTB7/21/

5 ответов


следующая функция будет искать объект и все его дочерние объекты / массивы и заменит ключ новым значением. Он будет применяться глобально, поэтому он не остановится после первой замены. Раскомментируйте прокомментированную строку, чтобы сделать ее такой.

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:http://jsfiddle.net/qLTB7/28/


вот другой подход с использованием массив.прототип.некоторые. Он предполагает, что имя свойство во внешних объектах должно быть на самом деле имя (обратите внимание на капитализацию).

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

преимущество некоторые это то, что он останавливается, как только обратный вызов возвращает true.


попробуй такое

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

Я думаю, что это должно работать для вас:-

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

может быть, более емкий соль Н

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

лично: если бы это был я, при создании этих объектов, я бы создал новый obj и ключ их по id.

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

и тогда вы могли бы просто сделать:

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

посмотреть здесь: http://jsfiddle.net/qLTB7/40/