0

私は以下のJSONを持っています。id = 111のオブジェクトを取得したいと思います。深さはjsonによって異なる場合があります。ネストされた複合オブジェクトから特定のオブジェクトを取得する

object = [ 
      { 
      id= 1, 
      name : 'a', 
      childNodes : [ { 
          id=11, 
          name:'aa', 
          childNodes:[{ 
             id: 111, 
             name:'aaaa', 
             childNodes:[] 
             }] 
         }] 

      }] 

必要な出力{ id: 111, name:'aaaa', childNodes:[] }

最速のアルゴリズムや方法を探しています。データは実際には35000ノード以上の深さまで20の桁まで膨大になります。

助けてください。

+1

は、オブジェクト内の任意の予測可能な構造がありますか?例えば。親のIDが1で始まる子供のIDが1よりも小さい場合 – Aron

+0

申し訳ありませんが、述語は使用できません。構造に関する確かなことはありません。 – Kracki

+1

すべてが一意のIDか、すべてで返された配列を返しますか一致するIDを持つオブジェクト? – Aron

答えて

1

for...inループを使用して、これに対して再帰関数を作成できます。ここで

var object = [{"id":1,"name":"a","childNodes":[{"id":11,"name":"aa","childNodes":[{"id":111,"name":"aaaa","childNodes":[]}]}]},{"id":2,"name":"a","childNodes":[{"id":22,"name":"aa","childNodes":[{"id":123,"name":"aaaa","childNodes":[]}]}]}] 
 

 
function findById(data, id) { 
 
    for(var i in data) { 
 
    var result; 
 
    if(data.id == id) return data 
 
    if(typeof data[i] == 'object' && (result = findById(data[i], id))) return result 
 
    } 
 
} 
 

 
console.log(findById(object, 111)) 
 
console.log(findById(object, 22))

1

someを使用して再帰関数である:

function findNested(arr, id) { 
 
    var res; 
 
    return arr.some(o => res = Object(o).id === id ? o 
 
          : findNested(o.childNodes, id)) && res; 
 
} 
 

 
var object = [{ 
 
    id: 1, 
 
    name : 'a', 
 
    childNodes : [ { 
 
     id: 11, 
 
     name:'aa', 
 
     childNodes:[{ 
 
      id: 111, 
 
      name:'aaaa', 
 
      childNodes:[] 
 
     }] 
 
    }] 
 
}]; 
 

 
console.log(findNested(object, 111)); 
 
console.log(findNested(object, 9));

関連する問題