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

JavaScript中如何按数组元素键规则将数组转为目标结构对象

数组转指定结构对象实现方案

实现思路

按照转换规则,核心逻辑分三步:

  • 拆分每个数组元素,提取操作类型和数字ID两个维度的信息
  • 以数字ID为外层对象的键,每个键对应存储该ID下已存在的操作类型
  • 给每个ID补全所有操作类型字段,存在对应记录的字段值为true,不存在的为false

通用版实现(无硬编码,兼容动态操作类型)

不需要提前固定操作类型枚举,后续新增任意操作类型(比如typeDelete、typeExport)都可以自动适配,时间复杂度O(n),性能最优:

function transform(arr) {
  const actionTypes = new Set();
  const idMap = new Map();

  // 第一次遍历收集全量维度信息
  arr.forEach(str => {
    const [actionType, id] = str.split('_');
    actionTypes.add(actionType);
    if (!idMap.has(id)) idMap.set(id, new Set());
    idMap.get(id).add(actionType);
  });

  // 组装最终结果
  const result = {};
  idMap.forEach((existActions, id) => {
    result[id] = {};
    actionTypes.forEach(type => {
      result[id][type] = existActions.has(type);
    });
  });
  return result;
}

// 测试示例
const input = [
  'typeRead_1',
  'typeModify_1',
  'typeModify_2',
  'typeRead_3',
];
console.log(transform(input)); 
// 输出完全匹配需求给出的目标结构

简化版实现(操作类型固定场景)

如果确定操作类型只有typeRead、typeModify两种,可以用reduce写更精简的代码:

const transform = arr => arr.reduce((result, str) => {
  const [type, id] = str.split('_');
  // 初始化当前ID的默认值,所有类型默认false
  if (!result[id]) result[id] = { typeRead: false, typeModify: false };
  // 命中的类型设为true
  result[id][type] = true;
  return result;
}, {});

注意:简化版硬编码了操作类型枚举,如果后续新增操作类型需要手动修改初始值配置,通用性弱于上面的通用版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 20:31:11