如何将含嵌套对象的数组转为指定映射结构?能否用Array.prototype.reduce?
嵌套对象数组转指定映射结构的实现方案
问题描述
给定如下结构的对象数组:
let array = [ { "A": [ { "X": "abc123", "Y": "abc213", "Z": "xyz123" }, { "X": "xyz7", "Y": "wqr", "Z": "dasd" } ] }, { "B": [ { "X": "sadasd", "Y": "asdasd", "Z": "sadasd" }, { "X": "ffff531", "Y": "asdddz", "Z": "xx11155" } ] } ]
需要转换为以下映射结构:外层键保持A/B不变,内层键为子对象的X属性值,对应值为子对象本身:
{ "A": { "abc123": { "X": "abc123", "Y": "abc213", "Z": "xyz123" }, "xyz7": { "X": "xyz7", "Y": "wqr", "Z": "dasd" } }, "B": { "sadasd": { "X": "sadasd", "Y": "asdasd", "Z": "sadasd" }, "ffff531": { "X": "ffff531", "Y": "asdddz", "Z": "xx11155" } } }
解决方案:使用Array.prototype.reduce实现
完全可以用reduce处理这种嵌套场景,核心是通过两层reduce分别处理外层数组和内层子数组:
const array = [ { "A": [ { "X": "abc123", "Y": "abc213", "Z": "xyz123" }, { "X": "xyz7", "Y": "wqr", "Z": "dasd" } ] }, { "B": [ { "X": "sadasd", "Y": "asdasd", "Z": "sadasd" }, { "X": "ffff531", "Y": "asdddz", "Z": "xx11155" } ] } ]; const transformed = array.reduce((result, currentObj) => { // 获取当前对象的唯一键(A/B) const outerKey = Object.keys(currentObj)[0]; // 将内层数组转换为以X为键的映射对象 const innerMap = currentObj[outerKey].reduce((innerResult, item) => { innerResult[item.X] = item; return innerResult; }, {}); // 把处理后的内层映射赋值给结果对象的对应键 result[outerKey] = innerMap; return result; }, {}); console.log(transformed);
代码说明
- 外层
reduce:初始化空对象作为最终结果的累加器,遍历原数组中的每个对象(每个对象仅包含一个键值对)。 - 提取外层键:通过
Object.keys(currentObj)[0]获取当前对象的唯一键(如A或B)。 - 内层
reduce:针对每个外层键对应的数组,将其转换为以子对象X属性为键的映射结构,初始化空对象作为内层累加器。 - 组装结果:将内层映射对象赋值给最终结果的对应外层键,返回累加器继续遍历。
内容的提问来源于stack exchange,提问作者Vipul Sinha
相关产品推荐
相关产品推荐

