如何遍历含嵌套projects数组的对象数组并生成指定结构的新对象数组?
问题:转换嵌套对象数组生成扁平化的结果数组
我有如下嵌套结构的对象数组,每个对象包含projects属性,而projects本身也是一个对象数组:
const data = [ { "title": "Release", "projects": [ { "name": "Server", "result": { "success": 0, "failure": 100 } } ] }, { "title": "Payments", "projects": [ { "name": "Platform1", "result": { "success": 100, "failure": 0 } }, { "name": "Platform2", "result": { "success": 50, "failure": 50 } } ] } ]
我希望遍历这个数组,生成一个扁平化的数组,其中每个对象的name字段由原数据的title和对应项目的name拼接而成,预期结果如下:
const result = [ { name: 'Release-Server', success: 0, failure: 100 }, { name: 'Payments-Platform1', success: 100, failure: 0 }, { name: 'Payments-Platform2', success: 50, failure: 50 } ];
我尝试了下面的代码,但不知道如何把处理后的对象推入新数组,没能得到预期结果:
data.forEach(prj => { prj.projects.forEach((project) => { // 不知道如何将这些信息推入新的对象数组 }) });
解决方案
你的思路方向是对的,只需要补充几个小步骤就能实现需求,下面给你两种可行的写法:
方法一:基于你现有代码的完善版
先初始化一个空数组存储结果,然后在嵌套的forEach里构造目标对象并推入数组即可:
const result = []; data.forEach(item => { item.projects.forEach(project => { // 拼接name字段,同时展开result里的成功/失败属性 const newObj = { name: `${item.title}-${project.name}`, ...project.result }; // 将新对象推入结果数组 result.push(newObj); }); }); console.log(result);
方法二:更简洁的flatMap写法
如果想让代码更精炼,可以用flatMap替代嵌套forEach,它能直接帮你完成数组的映射+扁平化操作:
const result = data.flatMap(item => { return item.projects.map(project => ({ name: `${item.title}-${project.name}`, ...project.result })); }); console.log(result);
这两种写法都能得到你想要的结果,flatMap的优势在于它会先对每个外层元素执行map转换,再自动把所有子数组合并成一个扁平化的数组,非常适合处理这类嵌套数组的转换需求。
内容的提问来源于stack exchange,提问作者Aren Trot
相关产品推荐
相关产品推荐

