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

时间:2015-10-04 02:39:28

标签: javascript arrays json algorithm object

所以我挂进了一个返回值的平面数组的应用程序api - 值的顺序定义了数据的特定结构,我希望能够将这个数组转换为反映这个数组的对象基础结构。

向后工作,这是我最终想要的结果:

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

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

1 个答案:

答案 0 :(得分:1)

没有规则说你的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)
    });   
}

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