2016-09-20 13 views
2

私はJSONオブジェクトを持っています。私が達成しようとしているのは、idでchild_objectsのオブジェクトを検索できるということです。私は、次のように再帰とArray.each()および機能を使用しています:mootools javascript戻り値再帰を伴うArray.each()

1 Template.get_object_attributes_by_id = function(id, template) 
2 { 
3 var template_obj = JSON.parse(template); 
4 console.log(Template.check_for_id_equality(template_obj, id); 
5 return Template.check_for_id_equality(template_obj, id); 
6 } 
7 
8 Template.check_for_id_equality = function(obj, id) 
9 { 
10 if (obj.attrs.id !== id) { 
11  if (obj.children === null || obj.children === undefined) { 
12  return; 
13  } 
14  Array.each(obj.children, function(obj_child) { 
15  return Template.check_for_id_equality(obj_child, id); 
16  }); 
17 } 
18 else { 
19  console.log(obj); 
20  return obj; 
21 } 
22 } 

ライン19の出力はTemplate.get_object_attributes_by_id(id, template)を呼び出した後に正しいオブジェクトですが、ライン4の出力がundefinedです。 Array.each()は返品を「無視」し、そのまま続けるようです。だから今私の質問は、どのようにオブジェクトを正しく返すように、私はそれを関数get_object_attributes_by_id()で取得することです。

更新:

入力(テンプレート)Iは、例えば、ID「プレースホルダ-2」を探していた次のようなJSONオブジェクトです。これは単なる例ですので、実際のJSONオブジェクトは明らかに有効であるため、括弧などがないか探してください。

{ 
    "className":"Stage", 
    "attrs":{ 
    "width":1337, 
    "height":4711 
    }, 
    "children":[{ 
    "className":"Layer", 
    "id":"placeholder-layer", 
    "attrs":{ 
     "width":1337, 
     "height": 4711 
    }, 
    "children":[{ 
     "className":"Text", 
     "id":"placeholder-1", 
     "attrs":{ 
     "fontsize":42, 
     "color":"black", 
     ... 
     } 
    }, 
    { 
     "className":"Text", 
     "id":"placeholder-2", 
     "attrs":{ 
     "fontsize":37, 
     "color":"red", 
     ... 
     } 
    }, 
    ... 
    ] 
    }] 
} 

そして、これが予想される出力になります。私の同僚と私

{ 
    "className":"Text", 
    "id":"placeholder-2", 
    "attrs":{ 
    "fontsize":37, 
    "color":"red", 
    ... 
    }, 
} 
+0

あなたはMooToolsのの[Object.subset](http://mootools.net/core/docs/1.6.0/Types/Object#Object:Object-subset)を確認しました?それがあなたが望むものでないなら、達成したいと思うエントリーとアウトプットの例を提供できますか? – Sergio

+0

@Sergio残念ながら 'Object.subset'は私が必要なものではありません。私は入力の例と期待される出力を使って質問を更新しました。 – GiftZwergrapper

答えて

1

はもう少し調査し、試した後は、「 - ループの代わりに、「ため」を使用することによって、問題が自分自身を解決しましたArray.each() "ここで

は、ソリューションです:

1 Template.get_object_attributes_by_id = function(id, template) 
2 { 
3 var template_obj = JSON.parse(template); 
4 console.log(Template.check_for_id_equality(template_obj, id); 
5 return Template.check_for_id_equality(template_obj, id); 
6 } 
7 
8 Template.check_for_id_equality = function(obj, id) 
9 { 
10 if (obj.attrs.id === id) { 
11  return obj; 
12 } 
13 if (obj.children === null || obj.children === undefined) { 
14  return false; 
15 } 
16 for (var i = 0; i < obj.children.length; i++) { 
17  var ret_val = Template.check_for_id_equality(obj.children[i], id); 
18  if (ret_val !== false) { 
19  return ret_val; 
20  } 
21 } 
22 return false; 
23 }