繁体   English   中英

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

[英]Javascript, check if array contains a function

我以这种方式将一些匿名函数推入数组:

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

然后我执行所有功能

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

问题是:如何检查函数是否已经存在于myArray 我试图使用toSource()进行比较,但是它不起作用...知道吗?

提前致谢。

将功能作为字符串进行比较:

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

这甚至可以与匿名函数一起使用,但是假设等效地,您的意思是具有相同的代码,一个又一个字符。

您可以使用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

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

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

  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;
       }
     }
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM