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

如何过滤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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:42:29