4

子を持つことができるオブジェクトの階層があるとします。すべてのオブジェクトには固有の がありidます。のみを指定して、この階層の任意の場所からオブジェクトを取得する必要がありますid。たとえば、階層は次のようになります。

var 階層 = [
  {id: 1、子: [
    {id: 7}、
    {id: 8}
  ]}、
  {ID: 2}、
  {id: 3、子: [
    {id: 9}、
    {ID: 10、子: [
      {ID: 11}、
      {ID: 12}、
      {ID: 13}
    ]}
  ]}、
  {id: 4}、
  {id: 5}、
  {id: 6、子: [
    {id: 14}
  ]}
];

関数呼び出しは次のようになります。

retrieveObjectById(10、階層);
// => {id: 10、子: [...]}

Array.filter を使用して、要素の子要素が検出されたときに再帰的に呼び出される関数を作成しようとしましたが、祖先も返します。

4

1 に答える 1

3

これらの問題を解決するためのアイデアは、一般的に次のような再帰関数を使用することです:

function deepFind(obj, id) {
    if (obj.id==id) return obj;
    if (obj.children) {
       for (var i=0; i<obj.children.length; i++) {
           var o = deepFind(obj.children[i], id);
           if (o) return o;
       }
    }
}

ルート レベルのオブジェクトは同じ構造ではないため、ループするhierarchyか、似たものにすることができます。

var myObject = deepFind({children:hierarchy}, 10);

デモンストレーション

于 2013-05-10T17:08:42.567 に答える