如何将JavaScript对象数组合并为指定结构的单个对象?
如何将JavaScript对象数组转换为指定的嵌套对象结构?
你好呀~我看你作为JavaScript和JSON新手,正在尝试把一个对象数组转换成特定的嵌套对象结构,不过之前的代码没达到预期,咱们一步步来解决这个问题:
首先,先明确你的原始数据:
let data = [ { "build_name":"name1", "build_type":"element", "info":{ "element":"testvalue", "repository":"mag", "version":123 } }, { "build_name":"name2", "build_type":"element", "info":{ "element":"abcd", "repository":"uuuuu", "version":"ttttt" } } ];
你想要的预期结果是:
{ "build":{ "name1":{ "type":"element", "info":{ "element":"testvalue", "repository":"mag", "version":123 } }, "name2":{ "type":"element", "info":{ "element":"abcd", "repository":"uuuuu", "version":"ttttt" } } } }
先看看你之前代码的问题:
- 你用了数组
test来存储每一项,但预期结果里build是一个对象,不是数组,所以不需要用数组收集; - 你创建的
test2对象结构错误——把[arr.build_name]和"info"放在了同一层级,而不是把info嵌套在[arr.build_name]对应的对象里; - 最后尝试把数组
test直接放进{"build" : { test } },这会导致语法错误,对象中不能直接用这种方式嵌套数组变量。
正确的实现方法:
我们可以先创建目标对象,然后遍历原始数组,把每一项的build_name作为键,对应的type和info作为值嵌套进去:
let data = [ { "build_name":"name1", "build_type":"element", "info":{ "element":"testvalue", "repository":"mag", "version":123 } }, { "build_name":"name2", "build_type":"element", "info":{ "element":"abcd", "repository":"uuuuu", "version":"ttttt" } } ]; // 初始化目标对象 const result = { build: {} }; // 遍历原始数组 data.forEach(item => { // 把每个item的build_name作为键,对应的type和info作为值 result.build[item.build_name] = { type: item.build_type, info: item.info // 直接复用原info对象即可,不需要重新解构赋值 }; }); console.log(JSON.stringify(result, null, 2));
代码解释:
- 首先创建
result对象,里面先初始化build为一个空对象,匹配你预期的最外层结构; - 遍历
data数组时,每一项的build_name作为result.build的属性名; - 每个属性对应的对象包含
type(对应原build_type)和info(直接复用原对象里的info,省去手动复制每个属性的麻烦); - 最后用
JSON.stringify带缩进参数输出,就能得到你想要的格式化后的JSON结构啦。
如果你想更简洁,还可以用reduce方法实现:
const result = { build: data.reduce((acc, item) => { acc[item.build_name] = { type: item.build_type, info: item.info }; return acc; }, {}) }; console.log(JSON.stringify(result, null, 2));
reduce方法会从一个空对象开始,把每一项的内容逐步添加进去,最终得到build对应的对象,效果和forEach完全一致,看你习惯哪种写法~
内容的提问来源于stack exchange,提问作者kalaiyarasi M
相关产品推荐
相关产品推荐

