JavaScript如何将嵌套数组合并重构为单层标准对象数组
问题本质
你使用[].concat.apply([], arr)只能把外层嵌套数组打平,得到的是「记录对象、user对象、记录对象、user对象...」的平级结构,并没有将user属性合并到对应的记录对象中,因此达不到预期。
解决方案
遍历每个子数组,先提取同组共享的user对象,再给组内所有记录添加user属性,最后合并所有记录即可,代码如下:
const merged = arr.flatMap(subArr => { // 提取当前子数组中的公共user对象 const user = subArr.find(item => item.user); // 筛选出子数组中所有的业务记录(排除user项) const records = subArr.filter(item => !item.user); // 给每条记录挂载user属性后返回 return records.map(record => ({ ...record, user })); });
如果运行环境不支持flatMap,可以替换为以下兼容写法:
const merged = [].concat.apply([], arr.map(subArr => { const user = subArr.find(item => item.user); const records = subArr.filter(item => !item.user); return records.map(record => ({ ...record, user })); }));
处理后得到的merged就是你需要的[{_id: ..., user_id: ..., user: {...}}]格式的单层数组。
内容的提问来源于stack exchange,提问作者simon
相关产品推荐
相关产品推荐

