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

JavaScript多维数组处理:从对象属性生成子数组的最优方案

实现用户外观属性的单独数组生成最优方案

需求描述

我正在开发一款包含用户数据的应用,已获取目标用户的数据。目前需要将每个用户的指定外观属性(gender、eyeColor、hairColor、build、ethnicOrigin)整理为按属性分类的单独数组,例如:

gender array - ["1", "1", "1"]
eyeColor array - ["2", "1", "3"]
hairColor array - ["4", "1", "6"]
build array - ["6", "2", "4"]
ethnicOrigin array - ["6", "3", "5"]

现有代码问题

你当前的代码逻辑是按用户维度拆分属性,生成的是每个用户对应的属性对象数组再存入大数组,这和需求的「按属性维度聚合所有用户数据」不符。

最优实现方案

可以通过初始化属性-空数组的映射对象,再一次遍历所有用户填充数据,这种方式仅需遍历用户一次,逻辑简洁且效率更高:

完整代码示例

const people = [
  {
    name: "Billy",
    appearance: {
      gender: "1",
      eyeColor: "2",
      hairColor: "4",
      build: "6",
      ethnicOrigin: "6"
    }
  },
  {
    name: "Jason",
    appearance: {
      gender: "1",
      eyeColor: "1",
      hairColor: "1",
      build: "2",
      ethnicOrigin: "3"
    }
  },
  {
    name: "Roger",
    appearance: {
      gender: "1",
      eyeColor: "3",
      hairColor: "6",
      build: "4",
      ethnicOrigin: "5"
    }
  }
];

const needles = ["gender", "eyeColor", "hairColor", "build", "ethnicOrigin"];

// 初始化结果对象,每个属性对应空数组
const result = needles.reduce((acc, key) => {
  acc[key] = [];
  return acc;
}, {});

// 遍历所有用户,填充对应属性数组
people.forEach(person => {
  needles.forEach(key => {
    // 若属性不存在则推入null,否则推入对应值
    result[key].push(person.appearance[key] ?? null);
  });
});

// 输出结果
console.log("gender array -", result.gender);
console.log("eyeColor array -", result.eyeColor);
console.log("hairColor array -", result.hairColor);
console.log("build array -", result.build);
console.log("ethnicOrigin array -", result.ethnicOrigin);

代码说明

  • 第一步用reduce快速初始化结果对象,确保每个目标属性都绑定一个空数组;
  • 遍历每个用户时,针对每个属性键,将用户的属性值(若属性不存在则用null补全)推入对应数组;
  • 最终result对象中,每个键对应一个属性的所有用户数据数组,完全匹配需求格式。

内容的提问来源于stack exchange,提问作者The Old County

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 13:57:46