javascript - <node.js> 如何有效地将平面值数组解析为具有嵌套属性的对象?

标签 javascript arrays json algorithm object

所以我连接到一个返回平面值数组的应用程序 api - 值的顺序定义了数据的特定结构,我希望能够将这个数组转换成一个对象来反射(reflect)这个底层结构。

回过头来看,这就是我想要的结果:

{"app_name":"app_X",
 "affected_nodes" : [
                       {"node_name":"node_X","node_id":"xxx"},
                       {"node_name":"node_Y","node_id":"yyy"}
                    ]
}

但这就是我得到的:

["app_X","2","node_X","xxx","node_Y","yyy"]

实际数据要复杂得多,多层属性数组相互嵌套。如您所见,我得到了原始平面数组中每个嵌套属性的长度,在我的示例中表示为 "2"。我已经开始争论将平面数组转换为适当的对象结构,整个业务似乎效率很低且难以维护。我的方法目前看起来像这样:

var arr = ["app_X","2","node_X","xxx","node_Y","yyy"];
var obj = {};

obj.app_name = arr[0];

var num_nodes = arr[1];

obj.affected_nodes = [];

var position = 1;

for(var i = 0; i < num_nodes; i++){
    var sub_obj = {};
    sub_obj.node_name = arr[position + 1];
    sub_obj.node_id = arr[position + 2];
    obj.affected_nodes.push(sub_obj);
    position = position + 2;
}

这是行之有效的,但我觉得可能有一个我没有想到的更有效的解决方案。是否有更好的算法或库函数来完成此类任务?

最佳答案

没有规则规定您的 for 循环计数器必须从零开始或在每次迭代后递增 1。所以我们可以通过删除丑陋的 position 变量来简化事情:

for (var i = 2, length = arr.length; i < length; i += 2) {
    obj.affected_nodes.push({
        node_name: arr[i],
        node_id: (arr[i + 1] || null)
    });   
}

此外,如果 arr[1] 是字符串而不是整数,我不知道您的 num_nodes 限制如何工作。

关于javascript - <node.js> 如何有效地将平面值数组解析为具有嵌套属性的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32929501/

相关文章:

javascript - ng-repeat 不刷新 DOM

c# - Linq 查询字段是否在数组中?

mysql - 在蛋糕模板文件中设置和获取bindModel查询

javascript - 如何填写数组中不存在的边界之间的日期?

php - 使用php将android连接到mysql

php - 选择多个 div 并更改它们的背景

javascript - 显示/隐藏 jQuery

javascript - 使用 CSS 和 Javascript 淡入淡出文本

json - 如何循环遍历单个 JSON 文件以使每个对象出现在 Ionic tinder 卡片上?

android - 解析/读取 Json 的最简单方法