JS:动态 populate/combine 嵌套对象 objects/properties > 我们有更简单的方法吗?
JS: dynamically populate/combine object with nested objects/properties > do we have a simpler way?
问题:我有一个 JS 全局变量,我必须检查它是否作为具有 "menus configurations" 的对象并填充缺少的配置。
所以这项工作是基于这个 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 了解一点,但恐怕我的解决方案不是最好的方法。还是我掉到 "root of all evil" :P
编辑:
输入来自 IndexedDB "table",因此结果由类似于图片上的对象 ("lines") 组成:
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
好吧...老实说,我不认为我理解该菜单配置背后的逻辑,但仅根据您的代码我可以做出以下改进:
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
作为 false
.
这样,当你执行array[r.menu_type] = array[r.menu_type] || {};
时,如果array[r.menu_type]
未定义,它会收到{}
。
希望对您有所帮助。
问题:我有一个 JS 全局变量,我必须检查它是否作为具有 "menus configurations" 的对象并填充缺少的配置。
所以这项工作是基于这个 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 了解一点,但恐怕我的解决方案不是最好的方法。还是我掉到 "root of all evil" :P
编辑: 输入来自 IndexedDB "table",因此结果由类似于图片上的对象 ("lines") 组成: 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
好吧...老实说,我不认为我理解该菜单配置背后的逻辑,但仅根据您的代码我可以做出以下改进:
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
作为 false
.
这样,当你执行array[r.menu_type] = array[r.menu_type] || {};
时,如果array[r.menu_type]
未定义,它会收到{}
。
希望对您有所帮助。