Search / delete / add / update objects in nested json

I have a problem finding an object in nested json! I need to perform operations like “add” to an object and “delete” an object in this nested json. It would be easy to get the object using "JSON.stringify" and in this line find the parameter ID of the object (each object has its own unique identifier). Then from this point, find your braces wrappers ({}), I could get the object myself, and then delete it or add a new object to it.

I had this idea, but I have no idea how to choose its braces ... I think it might work, but what do you do? :)

Here will be an example of an object! https://jsfiddle.net/gb8hb8g7/

 var aa = [ {name: "aaa", id: 1, items: [ {name: "bbb", id: 15, items: [ {name: "ccc", id: 44}, {name: "ddd", id: 91} ]}, {name: "eee", id: 12} ] } ]; console.log(JSON.stringify(aa)); 
+4
source share
2 answers

You can navigate nested JSON recursively to perform the necessary operations.

 var aa = [ {name: "aaa", id: 1, items: [ {name: "bbb", id: 15, items: [ {name: "ccc", id: 44}, {name: "ddd", id: 91} ]}, {name: "eee", id: 12} ] } ]; var fff = {name: "fff", id: 13}; addObj(aa, 91, fff); // Add obj to same array as item 91 chgObj(aa, 91, '^', 'name', 'zzz'); // Change 'name' property of item 91 chgObj(aa, 91, '+', 'other', 'test'); // Add property to item 91 chgObj(aa, 91, '+', 'gone', 'delete me'); // Add property to item 91 chgObj(aa, 91, '-', 'gone'); // Delete property from item 91 dltObj(aa, 44); // Delete item 44 function addObj(itemArr, nId, newObj) { for (var i = 0; i < itemArr.length; i++) { if (itemArr[i].id && itemArr[i].id === nId) { itemArr.push(newObj); } else { if (itemArr[i].items) { addObj(itemArr[i].items, nId, newObj); } } } } function chgObj(itemArr, nId, operator, prop, val) { for (var i = 0; i < itemArr.length; i++) { if (itemArr[i].id && itemArr[i].id === nId) { switch (operator) { case '+': if (!itemArr[i][prop]) { itemArr[i][prop] = val; } break; case '-': if (itemArr[i][prop]) { delete itemArr[i][prop]; } break; case '^': if (itemArr[i][prop]) { itemArr[i][prop] = val; } break; } } else { if (itemArr[i].items) { chgObj(itemArr[i].items, nId, operator, prop, val); } } } } function dltObj(itemArr, nId) { for (var i = 0; i < itemArr.length; i++) { if (itemArr[i].id && itemArr[i].id === nId) { itemArr.splice(i, 1); } else { if (itemArr[i].items) { dltObj(itemArr[i].items, nId); } } } } alert(JSON.stringify(aa)); 

New fiddle: https://jsfiddle.net/ta4pjqew/2

+1
source

You should just use your objects as if you were going through a large array:

  var aa = [ {name: "aaa", id: 1, items: [ {name: "bbb", id: 15, items: [ {name: "ccc", id: 44}, {name: "ddd", id: 91} ]}, {name: "eee", id: 12} ] } ]; aa[0].name = 'abc'; aa[0].newprop = 23; console.log(aa[0].items[0].items[1]); delete aa[0].items[0].items[1]; console.log(aa[0].items[0].items[1]); console.log(JSON.stringify(aa)); 
+1
source

All Articles