如何递归搜索嵌套对象以找到我提供的对象引用的PATH?
我的原始对象如下:
a = {
b: [
{ children: [...more objects] },
{ children: [] }
etc..
],
c: [
{ children: [...more objects] },
{ children: [] }
etc..
]
}
我想调用一个函数findDeepAndStorePath(a, obj)
,它会找到对象引用并将其路径存储在索引数组中,例如:[' b',0,1,2 ]。
答案 0 :(得分:3)
function findPath(a, obj) {
for(var key in obj) { // for each key in the object obj
if(obj.hasOwnProperty(key)) { // if it's an owned key
if(a === obj[key]) return key; // if the item beign searched is at this key then return this key as the path
else if(obj[key] && typeof obj[key] === "object") { // otherwise if the item at this key is also an object
var path = findPath(a, obj[key]); // search for the item a in that object
if(path) return key + "." + path; // if found then the path is this key followed by the result of the search
}
}
}
}
var obj = {
"a": [1, 2, {"o": 5}, 7],
"b": [0, [{"bb": [0, "str"]}]]
};
console.log(findPath(5, obj));
console.log(findPath("str", obj).split(".")); // if you want to get the path as an array you can simply split the result of findPath

答案 1 :(得分:1)
您可以使用Object.keys
并检查值。如果找到,则返回实际路径并停止迭代。如果没有,则检查所有可能的路径。
此提案尊重数组中的数字键。
function findPath(a, obj) {
function iter(o, p) {
return Object.keys(o).some(function (k) {
result = p.concat(Array.isArray(o) ? +k : k);
return o[k] === a || o[k] && typeof o[k] === 'object' && iter(o[k], result);
});
}
var result;
return iter(obj, []) && result || undefined;
}
var obj = { a: [1, 2, { o: 5 }, 7], b: [0, [{ bb: [0, "str"] }]] };
console.log(findPath(5, obj)); // ["a", 2, "o"]
console.log(findPath("str", obj)); // ["b", 1, 0, "bb", 1]
console.log(findPath(42, obj)); // undefined

.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:0)
不要重新发明轮子。我们将object-scan用于所有数据处理需求。一旦将头缠住它,它就会很强大。这是您将其用于问题的方式
const objectScan = require('object-scan');
const findPath = (id, data) => objectScan(['**'], {
abort: true,
rtn: 'key',
filterFn: ({ value }) => value === id
})(data);
const obj = {
a: [1, 2, { o: 5 }, 7],
b: [0, [{ bb: [0, 'str'] }]]
};
console.log(findPath(5, obj));
// => [ 'a', 2, 'o' ]
console.log(findPath('str', obj));
// => [ 'b', 1, 0, 'bb', 1 ]