基于三个数组生成指定新数组的简易实现方案咨询
解决方案:高效处理JavaScript数组生成目标结果
这里给你整理了一套简洁高效的实现方案,核心思路是先把原数组转换成映射表(Map),避免反复循环查找,让逻辑更清晰也不容易出错。
第一步:预处理原数组,构建快速查找映射
先把obj、groups转换成键值对映射,同时建立「组ID→组内对象值」的关联,这样后续替换和生成操作都能直接通过键查找,不用反复遍历数组:
// 原数组定义 const obj = [["TestObj","1","value1","1"],["TestObj2","2","value2","1"],["TestObj3","3","value3",["1","2"]]]; const groups = [["TestGrp", "1"],["TestGrp2", "2"]]; const lines = [["valueX, valueZ","valueY, valueD"],["OBJ(1)","OBJ(2),OBJ(3)"], ["GRP(1)","GRP(2)"]]; // 1. 构建obj的ID→完整对象映射 const objMap = new Map(obj.map(item => [item[1], item])); // 2. 构建group的ID→组名称映射 const groupMap = new Map(groups.map(item => [item[1], item[0]])); // 3. 构建组ID→组内所有obj的value列表映射 const groupToObjs = new Map(); obj.forEach(item => { // 统一处理组ID:不管是单个值还是数组,都转成数组格式 const groupIds = Array.isArray(item[3]) ? item[3] : [item[3]]; groupIds.forEach(gid => { if (!groupToObjs.has(gid)) groupToObjs.set(gid, []); groupToObjs.get(gid).push(item[2]); }); });
第二步:处理lines数组,完成替换
利用正则匹配OBJ(n)和GRP(n)格式,结合上面的映射表快速替换内容:
const processedLines = lines.map(line => { return line.map(segment => { // 把每个片段按逗号分割,逐个处理每个标识 return segment.split(', ') .map(part => { // 匹配OBJ(n) const objMatch = part.match(/OBJ\((\d+)\)/); if (objMatch) { const targetObj = objMap.get(objMatch[1]); return targetObj ? targetObj[2] : part; // 找不到则保留原内容 } // 匹配GRP(n) const groupMatch = part.match(/GRP\((\d+)\)/); if (groupMatch) { const targetValues = groupToObjs.get(groupMatch[1]); return targetValues ? targetValues.join(', ') : part; // 找不到则保留原内容 } // 非标识内容直接返回 return part; }) .join(', '); }); }); // 处理后的lines结果: // [ // ["valueX, valueZ","valueY, valueD"], // ["value1","value2, value3"], // ["value1, value2, value3","value3"] // ]
第三步:生成newObj数组
遍历原obj数组,结合映射表补充组名称信息,统一格式:
const newObj = obj.map(item => { const [objName, _, value, groupIdsRaw] = item; // 统一组ID格式为数组 const groupIds = Array.isArray(groupIdsRaw) ? groupIdsRaw : [groupIdsRaw]; // 把组ID转换成对应的组名称,找不到则保留原ID const groupNames = groupIds.map(gid => groupMap.get(gid) || gid); return [objName, value, groupIds, groupNames]; }); // 生成的newObj结果: // [ // ["TestObj", "value1", ["1"], ["TestGrp"]], // ["TestObj2", "value2", ["1"], ["TestGrp"]], // ["TestObj3", "value3", ["1","2"], ["TestGrp","TestGrp2"]] // ]
这种方式把「数据查找」和「业务逻辑」分开,相比嵌套循环更易读、易维护,也减少了出错概率。
内容的提问来源于stack exchange,提问作者Pujdo P.
相关产品推荐
相关产品推荐

