Javascript - 在嵌套对象中查找对象引用的路径

时间:2017-04-26 13:43:06

标签: javascript

如何递归搜索嵌套对象以找到我提供的对象引用的PATH?

我的原始对象如下:

a = {
 b: [
  { children: [...more objects] },
  { children: [] }
  etc..
 ],
 c: [
  { children: [...more objects] },
  { children: [] }
  etc..
 ]
}

我想调用一个函数findDeepAndStorePath(a, obj),它会找到对象引用并将其路径存储在索引数组中,例如:[' b',0,1,2 ]。

3 个答案:

答案 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 ]