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