2017-07-07 27 views
0

问题:我有一个JS全局变量,我必须检查它是否作为具有“菜单配置”的对象并填充缺少的配置。JS:动态填充/组合对象与嵌套的对象/属性>我们有一个更简单的方法吗?

所以这个工作是在此基础上AS2:

 var result_array = re.result.items; 

     _global.menu_array = new Array(); 
     var menu_type_num:Number = -1; 
     var menu_group_num:Number = -1; 
     var menu_id_num:Number = -1; 
     for (var i=0; i<result_array.length; i++){ 
      if (menu_type_num != result_array[i].menu_type){ 
       menu_type_num = result_array[i].menu_type; 
       menu_group_num = -1; 
       var type_array:Array = new Array(); 
       _global.menu_array[menu_type_num] = type_array; 
      } 
      if (menu_group_num != result_array[i].menu_group){ 
       menu_group_num = result_array[i].menu_group; 
       var group_array:Array = new Array(); 
       _global.menu_array[menu_type_num][menu_group_num] = group_array; 
      } 
      var menu_obj:Object = new Object(); 
      menu_id_num = menu_obj.menu_id = Number(result_array[i].menu_id); 
      menu_obj.menu_text = result_array[i].menu_text; 
      _global.menu_array[menu_type_num][menu_group_num][menu_id_num] = menu_obj; 
     } 

我已经达到了这个解决方案在JS:

result.then(function(res) 
    { 
     if(!_MEV2_GLOBAL.hasOwnProperty("menu_array")) 
     { 
      _MEV2_GLOBAL.menu_array = {}; 
     } 

     res.forEach(r => 
     { 
      if(!_MEV2_GLOBAL.menu_array.hasOwnProperty(r.menu_type)) 
      { 
       _MEV2_GLOBAL.menu_array[r.menu_type] = {}; 
      } 


     if(!_MEV2_GLOBAL.menu_array[r.menu_type].hasOwnProperty(r.menu_group)) 
      { 
       _MEV2_GLOBAL.menu_array[r.menu_type][r.menu_group] = {}; 
      } 

      if(!_MEV2_GLOBAL.menu_array[r.menu_type][r.menu_group].hasOwnProperty(r.menu_id)) 
      { 
       _MEV2_GLOBAL.menu_array[r.menu_type][r.menu_group][r.menu_id] = { 
        menu_id: r.menu_id, 
        menu_text: r.menu_text 
       }; 
      } 
     } 
    } 

这工作,但如果每一个分段做的...做我有另一种方式,减少什么或更多,更有效和简洁?

我对JS有一点了解,但恐怕我的解决方案并不是最好的解决方案。还是我坠落的“万恶之源”:P

编辑: 输入来自一个IndexedDB的“表”,这样的结果是由对象(“线”)类似一个上图片: for example, "t_menus_gre" select is the input

此ResultSet必须在GlobalVar插入,应遵循这种结构: this object is my GlobalVar and should include a subObject['menu_array'] with menus configs by type/group/id

+0

您能给我们一个示例输入和预期输出吗? – tiagodws

+0

我已经更新了我的问题,我希望它是你要求的;) – rantunes

回答

0

好了...我真的不认为我了解,菜单配置背后的逻辑,但完全基于你的代码,我可以做出以下改进:

result.then(res => { 

    _MEV2_GLOBAL.menu_array = _MEV2_GLOBAL.menu_array || {}; 
    const array = _MEV2_GLOBAL.menu_array; 

    res.forEach(r => { 
     array[r.menu_type] = array[r.menu_type] || {}; 
     array[r.menu_type][r.menu_group] = array[r.menu_type][r.menu_group] || {}; 
     array[r.menu_type][r.menu_group][r.menu_id] = array[r.menu_type][r.menu_group][r.menu_id] || { menu_id: r.menu_id, menu_text: r.menu_text }; 
    }); 

}); 

如果你只是想验证一个值定义,javascript中总是计算nullundefinedfalse""0false

这样,当您执行array[r.menu_type] = array[r.menu_type] || {};,如果array[r.menu_type]未定义,它会收到{}

希望能以某种方式帮助你。

+0

它来自一个旧的Flash游戏(根本没有任何文档),我必须在记录时间将其转换为html5/JS。这已经在网上,现在应该是几乎完全离线。我维护旧逻辑,并且这些配置在animateCC的画布上使用(旧的闪存转换)。 – rantunes

+0

嗯,好的!你有没有试过我写的代码? :) @rantunes – tiagodws

+1

它仍然按照假定的方式工作,并且更清洁。感谢您的建议,我不知道我可以做这种“三元的归属”! – rantunes

相关问题