如何根据子数组数据与长度重映射父级数据结构并修正结果?
问题解答
核心结论
- 重映射父级结构完全可行,前端无需后端修改数组结构即可实现需求;
- 当前数组结构合理,子数组无id字段不影响处理,可通过
value等关联字段完成匹配; - 现有代码逻辑存在两处关键错误,修正后即可得到目标输出。
错误分析
- 去重逻辑偏差:通过
value去重时,原数据中存在两个value=8100的子项,现有逻辑会保留第一个遇到的项,无法关联到你期望保留的第三个子项(bid:15000); - 父级与子项关联错误:最后一步用
obj.bid[index]取值是逻辑错误——newArrays中的元素是父级对象,index是新数组的索引,和父级内部bid数组的索引没有对应关系,导致出现undefined。
修正后的代码
this.arrays = [ { id: '1', idbid: '0000000001618', name: 'ebi', rate: '400', bid: [ { bid: 10000, date: '2022/12/12', value: 5000 }, { bid: 10000, date: '2022/12/14', value: 8100 }, { bid: 15000, date: '2022/12/15', value: 8100 }, ], }, { id: '2', idbid: '0000000001618', name: 'bio', rate: '100', bid: [{ bid: 8000, date: '2022/12/13', value: 8000 }], }, ]; // 扁平化所有子项并关联父级数据 const flatBids = this.arrays.flatMap(parent => parent.bid.map(child => ({ ...parent, ...child })) ); // 按value去重,保留最后一个出现的项(匹配期望输出) const uniqueBids = Array.from( new Map(flatBids.map(item => [item.value, item])).values() ); // 重映射为目标结构 const remapArrays = uniqueBids.map((item, index) => ({ id: String(index + 1), idbid: item.idbid, name: item.name, rate: item.rate, bid: item.bid, date: item.date, value: item.value, })); console.log(remapArrays);
代码说明
- 扁平化关联:用
flatMap将每个父级对象与子项合并,生成包含完整父级+子项数据的扁平数组; - 正确去重:使用
Map按value作为key存储数据,自动覆盖重复key,保留最后一个出现的项(匹配你期望的value=8100对应bid:15000的需求); - 结构重映射:直接从合并后的对象中提取字段,避免索引不匹配的问题。
运行修正后的代码即可得到你期望的输出结果。
内容的提问来源于stack exchange,提问作者Alkim Al
相关产品推荐
相关产品推荐

