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
相关产品推荐
相关产品推荐

