2017-04-26 23 views
1

入れ子オブジェクトを再帰的に検索して、私が提供しているオブジェクト参照へのPATHを見つける方法はありますか?私の元のオブジェクトがどのように見えるJavascript - 入れ子オブジェクトのオブジェクト参照へのパスを見つける

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

Iは、オブジェクト参照を見つけ、そのようなものとしてインデックスの配列でそれへのパスを格納するであろう機能findDeepAndStorePath(a, obj)呼び出したい:[「B」を、 0,1,2]である。

+0

あなたは申し訳ありませんが、あなたがこの上で起草気にしない – num8er

+0

混合データを歩いていくイベント・エミッターを使用して独自のコードを書く必要がありますか? –

答えて

2

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

+2

ニースとエレガントな答え! –

+0

これは素晴らしいです!ありがとう! –

1

あなたはObject.keysを使用して値をチェックすることができます。見つかった場合は、実際のパスが返され、反復が停止します。そうでない場合は、すべての可能性のあるpathesがチェックされます。

この提案は、配列から数値キーを守ります。

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; }

+0

とてもいいです!本当に選択された答えとして良い!ありがとう! –

関連する問題