所以我挂进了一个返回值的平面数组的应用程序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;
}
这是有效的,但我觉得可能有一个更有效的解决方案,我没有想到。是否有更好的算法或库函数来完成这类任务?
答案 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]
限制是如何工作的。