在嵌套的json对象中查找和更新

我使用此代码从sJhonny的问题中找到json对象所需的部分

数据样本

TestObj = { "Categories": [{ "Products": [{ "id": "a01", "name": "Pine", "description": "Short description of pine." }, { "id": "a02", "name": "Birch", "description": "Short description of birch." }, { "id": "a03", "name": "Poplar", "description": "Short description of poplar." }], "id": "A", "title": "Cheap", "description": "Short description of category A." }, { "Product": [{ "id": "b01", "name": "Maple", "description": "Short description of maple." }, { "id": "b02", "name": "Oak", "description": "Short description of oak." }, { "id": "b03", "name": "Bamboo", "description": "Short description of bamboo." }], "id": "B", "title": "Moderate", "description": "Short description of category B." }] }; 

function找到

 function getObjects(obj, key, val) { var objects = []; for (var i in obj) { if (!obj.hasOwnProperty(i)) continue; if (typeof obj[i] == 'object') { objects = objects.concat(getObjects(obj[i], key, val)); } else if (i == key && obj[key] == val) { objects.push(obj); } } return objects; } 

使用如下:

 getObjects(TestObj, 'id', 'A'); // Returns an array of matching objects 

此代码用于从源中选择匹配的片段。 但我想要的是用新值更新源对象并检索更新的源对象。

我想要类似的东西

 getObjects(TestObj, 'id', 'A', 'B'); // Returns source with updated value. (ie id:'A' updated to id:'B' in the returned object) 

我的代码

 function getObjects(obj, key, val, newVal) { var newValue = newVal; var objects = []; for (var i in obj) { if (!obj.hasOwnProperty(i)) continue; if (typeof obj[i] == 'object') { objects = objects.concat(getObjects(obj[i], key, val)); } else if (i == key && obj[key] == val) { obj[key] = 'qwe'; } } return obj; } 

如果我给obj[key] = 'qwe';这是有效obj[key] = 'qwe'; 但如果我将代码更改为obj[key] = newValue; 它更新为undefined。

为什么会这样?

您忘记在嵌套调用中传递newValue

 function getObjects(obj, key, val, newVal) { var newValue = newVal; var objects = []; for (var i in obj) { if (!obj.hasOwnProperty(i)) continue; if (typeof obj[i] == 'object') { objects = objects.concat(getObjects(obj[i], key, val, newValue)); } else if (i == key && obj[key] == val) { obj[key] = 'qwe'; } } return obj; } 

这个 ?

 function update(obj, key, newVal) { for(var i in obj) { if(typeof obj[i] == 'object') { update(obj[i], key, newVal)); } else if(i === key) { obj[i] = newVal; } } return obj; } 
 function getObjects(obj, key, val, newVal) { for (var i in obj) { if (!obj.hasOwnProperty(i)) continue; if (i == key && obj[key] == val) { obj[key] = newVal; } } return obj } 

这将使用newValue(newVal)对找到的值进行就地更新