
const originArr = [ { value: 'q', children: [ { value: 'w', children: [{ value: 'e' }, { value: 'r' }] }, { value: 't', children: [{ value: '' }, { value: 'y' }, { value: 'u' }] }, { value: 'i' } ] }, { value: 'o' } ]; const targetMap = new Map([ ['q/w/e', undefined], ['q/t', undefined] ]); function formatArr(arr, path) { for (let idx = arr.length - 1; idx >= 0; idx--) { const i = arr[idx]; let mapKey = arr[idx].value; if (path) mapKey = `${path}${mapKey ? '/' : ''}${mapKey}`; let flag = true; let finish = false; targetMap.forEach((value, key) => { if (key === mapKey) { finish = true; } else { const index = key.indexOf(mapKey); if (flag && index === 0) flag = false; } }); if (finish) continue; if (flag) { arr.splice(idx, 1); continue; } if (i.children) formatArr(i.children, mapKey); } } const copyArr = JSON.parse(JSON.stringify(originArr)); formatArr(copyArr); console.log(originArr, copyArr); 作用是根据一个 map 对象去找一个数组里面嵌套的值,表达可能不太清楚,代码能直接跑起来,输出一眼能看出来是干嘛的。求助大佬们这段代码怎么优化?感觉有很大的优化空间
1 SHF 2024-05-07 23:29:45 +08:00 笑死,连要解决的问题都没法描述清楚,直接丢了一坨代码要人看输出去猜,你这个要优化的不是代码,是你编程的思路。 |
2 summerwar 2024-05-07 23:42:28 +08:00 你直接把代码贴给 AI 吧,然后他会帮你优化下 |
3 LavaC 2024-05-07 23:43:29 +08:00 |
4 zsh2517 2024-05-08 00:19:57 +08:00 贴个运行结果  代码读不下去。从运行结果以及粗略扫过的代码来看。大概是 targetMap 定义了一些路径(这里没必要叫做 map ,没用到 value )。 originArr 是一个数字,假设这里的类型是 obj ,大概相当于是 interface obj {value: string, children?: obj[]) 然后,对 map 里面每一项 key ,按照 obj.value 作为目录名的完整路径,选择前缀能匹配 obj.value 的东西保留,其他删掉 |
5 zzlit OP @SHF v2 贴图不太方便,不然直接贴图了。我想的是 f12 贴代码就能看到运行输出结果了,不过确实我也还是需要描述一下解决的问题的,不然每个人读代码都会有不同的见解 |
9 x4storm 2024-05-08 13:18:34 +08:00 原始的代码确实难读:手动 for 循环;各种 flag 用于控制循环。这些面向过程式的编程风格极大的增加了阅读难度。 以下是 AI 优化过的代码,利用 js 的函数式编程特性,可以以更易读的方式组织代码: 主要的优化点是,用 filter 和 some 代替冗长的 for 循环。这里面的 Map 确实不是必要的,如果换成 string array 的话看起来会更简单一点。 ```Javascript const originArr = [ { value: "q", children: [{ value: "w", children: [{ value: "e" }, { value: "r" }] }, { value: "t", children: [{ value: "" }, { value: "y" }, { value: "u" }] }, { value: "i" }] }, { value: "o" }, ]; const targetMap = new Map([ ["q/w/e", undefined], ["q/t", undefined], ]); function formatArr(arr, path = '') { return arr.filter(item => { const currentPath = path ? `${path}/${item.value}` : item.value; // Check if the current path is needed if (targetMap.has(currentPath)) { return true; } // Check if any target path starts with the current path const isPrefix = Array.from(targetMap.keys()).some(key => key.startsWith(currentPath)); if (!isPrefix) { return false; } // Recursively filter children if they exist if (item.children) { item.children = formatArr(item.children, currentPath); } return true; }); } const copyArr = formatArr(JSON.parse(JSON.stringify(originArr))); console.log(originArr, copyArr); ``` |