Массив объектов 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'