如何从数组元素向JSON对象添加键?代码实现遇阻求助
解决JSON对象中从数组项添加元素的问题
我明白你现在的困扰——你想把Root里用逗号分隔的a、b、c字段拆分成独立的行对象,但当前的循环逻辑有问题,导致没法正确构建出目标结构。咱们来一步步修正:
首先先还原你的代码场景:
var j = { "Root": { "a": "1800,1200,3100", "b": "1500,1999,2001", "c": "40,60,50", "d": "this is not needed", "e": "nor this one" } }; var root = j.Root, l = root.a.split(",").length, hash = ["a", "b", "c"]; for (var i = 0; i < l; i++) { for (var x = 0; x < hash.length; x++) { root['row_' + i] = { "a": root.a.split(",")[i], "b": root.b.split(",")[i], "c": root....
问题分析
你当前的嵌套循环逻辑有两个核心问题:
- 每次内层循环都会重新给
root['row_' + i]赋值一个新对象,这会导致之前的属性被覆盖(哪怕你没写完代码,逻辑上也会出现这个问题); - 重复调用
split(",")会额外消耗性能,而且代码冗余度高。
修正后的解决方案
我们可以提前把a、b、c拆分成数组,然后直接用单层循环构建每一行对象:
var j = { "Root": { "a": "1800,1200,3100", "b": "1500,1999,2001", "c": "40,60,50", "d": "this is not needed", "e": "nor this one" } }; var root = j.Root; // 提前拆分字段为数组,避免重复调用split var aArr = root.a.split(","); var bArr = root.b.split(","); var cArr = root.c.split(","); var rowCount = aArr.length; // 循环创建每一行对象 for (var i = 0; i < rowCount; i++) { root['row_' + i] = { a: aArr[i], b: bArr[i], c: cArr[i] }; } // 可选:删除不需要的d、e字段 delete root.d; delete root.e; console.log(j);
代码解释
- 提前拆分数组:把
a、b、c的字符串一次性拆分成数组,避免在循环中重复执行split,既提升性能又让代码更简洁; - 单层循环构建行对象:直接根据索引把对应位置的a、b、c值组装成
row_i对象,逻辑清晰,不会出现属性覆盖的问题; - 清理冗余字段:如果不需要原来的
d和e,可以用delete操作符轻松移除它们。
运行后,j.Root会变成你想要的结构:
{ "a": "1800,1200,3100", "b": "1500,1999,2001", "c": "40,60,50", "row_0": { "a": "1800", "b": "1500", "c": "40" }, "row_1": { "a": "1200", "b": "1999", "c": "60" }, "row_2": { "a": "3100", "b": "2001", "c": "50" } }
如果你想要更现代的JavaScript写法(比如使用let/const和forEach),可以参考下面的版本:
const j = { "Root": { "a": "1800,1200,3100", "b": "1500,1999,2001", "c": "40,60,50", "d": "this is not needed", "e": "nor this one" } }; const root = j.Root; const aArr = root.a.split(","); const bArr = root.b.split(","); const cArr = root.c.split(","); // 使用forEach循环构建行对象 aArr.forEach((_, index) => { root[`row_${index}`] = { a: aArr[index], b: bArr[index], c: cArr[index] }; }); // 清理所有不需要的字段 delete root.d; delete root.e; delete root.a; delete root.b; delete root.c; console.log(j);
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

