2016-09-20 53 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()中獲得它。

更新:

輸入(模板)是像下面,其中我尋找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

一點點經過調查和審判,我的同事和我解決了這個問題自己,用「爲」 -loop而不是「 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 }