如何过滤JavaScript数组中逻辑重复的函数?
解决数组中重复函数的过滤问题
针对你给出的代码场景,这里提供两种无需使用eval的去重方案,对应不同的“重复”判定逻辑:
1. 按函数执行结果去重
如果你的需求是只要函数执行返回值相同就视为重复,可以借助Set记录已出现过的返回值,结合filter实现:
const func1 = () => { return 1 } const func2 = () => { return 1 } const func3 = () => { return 2 } let arr = [func1, func2, func3] const seenResults = new Set(); const filteredArr = arr.filter(func => { const result = func(); if (!seenResults.has(result)) { seenResults.add(result); return true; } return false; }); // 验证结果 console.log(filteredArr.map(f => f())); // 输出 [1, 2]
注意:这种方法会执行每个函数一次,如果你的函数带有副作用(比如修改外部状态、发送请求),需要谨慎使用。
2. 按函数体代码去重
如果你的需求是函数代码内容完全一致才视为重复(比如两个函数返回值相同但实现代码不同时不算重复),可以将函数转换为字符串后用Set追踪:
const func1 = () => { return 1 } const func2 = () => { return 1 } const func3 = () => { return 2 } let arr = [func1, func2, func3] const seenCode = new Set(); const filteredArr = arr.filter(func => { const codeStr = func.toString(); if (!seenCode.has(codeStr)) { seenCode.add(codeStr); return true; } return false; }); // 验证结果 console.log(filteredArr.map(f => f.toString())); // 输出 ["() => { return 1 }", "() => { return 2 }"]
注意:函数的字符串化结果会受代码格式影响,比如()=>1和() => { return 1 }会被判定为不同函数。如果需要忽略格式差异,可以先对字符串做预处理(比如去除所有空格、统一大括号写法)。
内容的提问来源于stack exchange,提问作者temosmoev
相关产品推荐
相关产品推荐

