Javascript,检查数组是否包含函数

时间:2014-07-23 12:33:07

标签: javascript arrays function

我正在以这种方式将一些匿名函数推送到数组中:

myArray.push(function(){ /* some cool code here */});
myArray.push(function(){ /* some cooler code here */});

然后我执行所有正在执行的功能

while (myArray.length) { myArray.shift().call();}

问题是:我如何检查某个功能是否已经进入myArray?我尝试使用toSource()进行比较,但它不起作用......有什么想法吗?

提前致谢。

3 个答案:

答案 0 :(得分:1)

将函数比较为字符串:

func1.toString() === func2.toString()

这甚至可以用于匿名函数,但假设相同的意思是具有相同的代码,字符的字符。

答案 1 :(得分:1)

您可以使用Array.prototype.indexOf检查您的阵列是否具有该功能:

var foo = function () {};
var bar = function () {};
var arr = [];

var addFunction = function (f) {
    if (arr.indexOf(fn) === -1) {
        arr.push(fn);
    }
};

addFunction(foo);
addFunction(foo);
console.log(arr.indexOf(foo));    // prints 0
console.log(arr.indexOf(bar));    // prints -1

您还可以创建地图以检查是否添加了此功能:

var foo = function foo() {};
var bar = function bar() {};
var arr = [];
var map = {};

var addFunction (fn) {
    if (!map[fn.name]) {
        arr.push(fn);
        map[fn.name] = fn;
    }
};

addFunction(foo);
addFunction(foo);
console.log(arr.indexOf(foo), map['foo']);    // prints 0, function foo() { ... }
console.log(arr.indexOf(bar), map['bar']);    // prints -1, undefined

注意:第二个示例可能不适用于匿名函数。

答案 2 :(得分:0)

当您向列表中添加函数时,请保留一个单独的对象,您可以在其中记录某种标识符,以便检查该函数是否已添加到数组中:

  var myArray = [], addedFunctions = {};
  for (var i = 0; i < whatever; ++i) {
     // do whatever
     if (something) {
       if (!addedFunctions[ "cool code 1" ]) {
         myArray.push(function() { /* cool code 1 */ });
         addedFunctions[ "cool code 1" ] = true;
       }
     }

     if (somethingElse) {
       if (!addedFunctions[ "cool code 2" ]) {
         myArray.push(function() { /* cool code 2 */ });
         addedFunctions[ "cool code 2" ] = true;
       }
     }
  }