在嵌套对象中匹配键值对的路径

我试图在嵌套对象中实现搜索。

// Returns an array of matching objects 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 (!$.isNumeric(obj[key]) && i == key && obj[key].toLowerCase().match(val)) { objects.push(obj); } } return objects; } 

此函数根据提供的键值对返回匹配对象。

我想要的是找到键值对的对象的路径。

样本数据

 TestObj = { "Categories": [{ "Product1": [{ "id": "a01", "name": "Pine", "description": "Short description of pine." }, { "id": "a02", "name": "Pine", "description": "Short description of pine." }, { "id": "a03", "name": "Poplar", "description": "Short description of poplar." }], "id": "A", "title": "Cheap", "description": "Short description of category A." }, { "Product2": [{ "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." }] }] }; 

我正在尝试编写一个函数

 function objPath(obj, key, val, path) { var result = []; var passName = ''; if (path) { passName = path; } var tempArray = []; for (var prop in obj) { var value = obj[prop]; if (typeof value === 'object') { tempArray = objPath(value, key, val, passName); $.each(tempArray, function (k, value) { result.push(value); }); } else if (prop == key && obj[key].toLowerCase().match(val)) { result.push(obj[key]); } } return result; } 

如果我把函数称为

 objPath(TestObj, 'id', 'b03'); 

哪个应返回Categories > Product2 > 3rd Row

但我所得到的只是关键。 如何修复objPath函数以获得所需的结果

我写了一个自定义函数

 function objPath(obj, key, val, path) { var result = []; var passName = ''; if (path) { passName = path; } var tempArray = []; for (var prop in obj) { var value = obj[prop]; if (typeof value === 'object') { tempArray = objPath(value, key, val, passName); $.each(tempArray, function (k, value) { result.push(value); }); } else if (!$.isNumeric(obj[key]) && prop == key && obj[key].toLowerCase().match(val)) { result.push(passName + '["' + obj[prop] + '"]'); } else { if ($.isNumeric(obj[prop])) { //passName += ' > ' + obj[prop]; } else { passName += '["' + obj[prop] + '"]'; } } } return result; } 

哪个会回归

 ["Categories"]["Product2"]["b03"]