代码之家  ›  专栏  ›  技术社区  ›  rantunes

JS:用嵌套对象/属性动态填充/组合对象>我们有更简单的方法吗?

  •  0
  • rantunes  · 技术社区  · 7 年前

    因此,这项工作基于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
                    };
                }
            }
        }
    

    这是可行的,但对每个子级都做一个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

    1 回复  |  直到 7 年前
        1
  •  0
  •   tiagodws    7 年前

    好的……老实说,我不认为我理解菜单配置背后的逻辑,但仅根据您的代码,我可以做出以下改进:

    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总是进行计算 null undefined false , "" 0 .

    array[r.menu_type] = array[r.menu_type] || {}; 如果 array[r.menu_type] {} .

    希望这对你有所帮助。