如何合并对象数组中父键相同的子元素到同一父键下
实现说明
你给出的预期输出存在语法错误,合法的JavaScript结构中,单个对象的键只能对应一个值,因此符合要求的正确结构应该是同父键对应的值为子对象组成的数组,结构如下:
[ {parent1: [{'child_id_1': 'value_child_1'}, {'child_id_1_1': 'value_child_1_1'}]}, {parent2: [{'child_id_2_1': 'value_child_2_1'}, {'child_id_2_2': 'value_child_2_2'}, {'child_id_2_3': 'value_child_2_3'}]} ]
实现思路
- 遍历原数组,以父键为分组标识,将所有同父键的子对象归集到同一个数组中
- 将分组后的映射表转换为目标数组结构
完整代码
// 原数组 const originArr = [ {parent1: {'child_id_1': 'value_child_1'}}, {parent1: {'child_id_1_1': 'value_child_1_1'}}, {parent2: {'child_id_2_1': 'value_child_2_1'}}, {parent2: {'child_id_2_2': 'value_child_2_2'}}, {parent2: {'child_id_2_3': 'value_child_2_3'}} ] // 按父键分组归集子对象 const groupMap = {} originArr.forEach(item => { // 取出当前项的唯一父键 const parentKey = Object.keys(item)[0] // 取出对应的子对象 const childObj = item[parentKey] // 不存在该分组则初始化空数组 if (!groupMap[parentKey]) groupMap[parentKey] = [] // 加入分组 groupMap[parentKey].push(childObj) }) // 转换为目标数组结构 const result = Object.entries(groupMap).map(([key, value]) => ({ [key]: value })) console.log(result)
原有代码问题说明
你之前的逻辑是用Set去重ID后仅通过find取第一个匹配的项,没有合并同分组下的其他子对象,因此只能得到单个键值对。
内容的提问来源于stack exchange,提问作者phcm
相关产品推荐
相关产品推荐

