所以我连接到一个返回平面值数组的应用程序 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/