【问题标题】:JS: dynamically populate/combine object with nested objects/properties > do we have a simpler way?JS:动态填充/组合对象与嵌套对象/属性 > 我们有更简单的方法吗?
【发布时间】:2017-07-08 05:07:14
【问题描述】:

问题:我有一个 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;
        }

我已经在 J​​S 中找到了这个解决方案:

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
                };
            }
        }
    }

这可行,但对每个子级别都做一个 if...我还有其他方法,使用 reduce 或其他更有效和简洁的方法吗?

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

编辑: 输入来自 IndexedDB “表”,因此结果由类似于图片中的对象(“行”)组成: for example, "t_menus_gre" select is the input

这个结果集必须插入一个 GlobalVar,它应该遵循这个结构: this object is my GlobalVar and should include a subObject['menu_array'] with menus configs by type/group/id

【问题讨论】:

  • 您能给我们一个示例输入和预期输出吗?
  • 我已经更新了我的问题,希望这是您的问题;)

标签: javascript dynamic properties populate


【解决方案1】:

好的...老实说,我不认为我理解该菜单配置背后的逻辑,但仅基于您的代码,我可以进行以下改进:

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""0 评估为 false

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

希望对您有所帮助。

【讨论】:

  • 它来自一个旧的 Flash 游戏(根本没有文档),我必须在创纪录的时间内将它转换为 html5/JS... 这个已经在线了,现在应该差不多了完全离线。我在维护旧的逻辑,这个配置被 animateCC 用在画布上(旧的 flash 转换)。
  • 嗯,好的!你试过我写的代码吗? :) @rantunes
  • 它仍然像预期的那样工作并且更干净。感谢您的建议,我不知道我可以做这种“三元归因”!
猜你喜欢
  • 2015-05-28
  • 2014-07-28
  • 2017-10-03
  • 1970-01-01
  • 2019-09-23
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多