You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含嵌套对象的数组转为指定映射结构?能否用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);

代码说明

  1. 外层reduce:初始化空对象作为最终结果的累加器,遍历原数组中的每个对象(每个对象仅包含一个键值对)。
  2. 提取外层键:通过Object.keys(currentObj)[0]获取当前对象的唯一键(如A或B)。
  3. 内层reduce:针对每个外层键对应的数组,将其转换为以子对象X属性为键的映射结构,初始化空对象作为内层累加器。
  4. 组装结果:将内层映射对象赋值给最终结果的对应外层键,返回累加器继续遍历。

内容的提问来源于stack exchange,提问作者Vipul Sinha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 14:17:37