如何从嵌套对象的数组中提取指定键值对生成新JSON
问题:访问双层嵌套JSON数据并提取指定字段失败
原始JSON数据
{ "obj": { "obj": [ { "cart": "2762", "name": "Joe", "testing": "no" }, { "cart": "214945", "name": "Larry", "testing": "yes" } ], "offset": 0, "total": 9715 } }
需求
提取数组内的每个对象,转换为仅包含name和testing字段的顶层对象,示例结果:
data = [ { name: 'joe', testing: 'no' }, { name: 'Larry', testing: 'yes' } ]
尝试的错误代码
const data = original_data.obj.obj.map(({ key, value }) => ({ [key]: value })); console.log(data);
错误结果
[ {}, {} ]
解决方法
错误原因
你在map里用({ key, value })解构遍历到的对象,但map的每一项是完整的对象(比如{ cart: "2762", name: "Joe", testing: "no" }),并非键值对数组,所以解构不到key和value,最终返回空对象。
正确写法1:直接解构指定字段
如果只需要固定保留name和testing,直接解构这两个字段并返回新对象即可,若需要把name转为小写,额外处理即可:
// 基础版(保留原name大小写) const data = original_data.obj.obj.map(({ name, testing }) => ({ name, testing })); // 处理name为小写的版本 const data = original_data.obj.obj.map(({ name, testing }) => ({ name: name.toLowerCase(), testing }));
正确写法2:动态指定保留字段(适合多字段场景)
如果需要保留的字段较多,可以先定义目标字段数组,再通过reduce构建新对象:
const keepFields = ['name', 'testing']; const data = original_data.obj.obj.map(item => { return keepFields.reduce((result, key) => { result[key] = item[key]; // 可选:处理name小写 if (key === 'name') { result[key] = result[key].toLowerCase(); } return result; }, {}); });
最终输出结果
执行上述正确代码后,会得到符合需求的结果:
[ { name: 'joe', testing: 'no' }, { name: 'larry', testing: 'yes' } ]
内容的提问来源于stack exchange,提问作者dagnabbit
相关产品推荐
相关产品推荐

