我使用此代码从Jhonny的Question中的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 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] = newValue;为未定义的更新,则此方法有效。
obj[key] = 'qwe';
obj[key] = newValue;
为什么呢?
您忘记在嵌套调用中传递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; }