在数组中检查函数是否存在

3
我有一个kinecticjs的图片对象,根据某些参数应用滤镜,但是当需要重新绘制时,它会再次应用滤镜,这意味着它会复制滤镜。
我知道我应该进行某种检查,但它会直接将函数应用于数组。
//create object
var image = new Kinetic.Image({
    image: alreadyLoadedImageObject
});

function addFilter(shouldAdd){
    if(shouldAdd){
        var filters = image.filters() || [];

        filters.push(Kinetic.Filters.RGB);

        image.filters(filters);
    }
}

layer.add(image);
stage.add(layer);

addFilter(true);
stage.draw();

setTimeout(function(){
    addFilter(true);
    stage.draw();
},500);

大致可以看出我目前正在做什么,在这种情况下,一旦超时运行,将对图像对象应用2个 Kinetic.Filters.RGB

我认为这是一个普遍的Javascript问题,而不仅仅是KineticJS,因为根源在于我需要知道过滤器数组中是否已经存在一个 Kinetic.Filters.RGB 函数。

所以有两个问题,是否有任何方法可以检查是否存在一个函数名称已经存在于数组中,例如 Array.indexOf?或者是否已经有一些预构建的方法在KineticJS中,但我还没有见过它们?

2个回答

4
x = function(){};
y = function(){};
a = [];
a.push(x);
a.indexOf(x); //0
a.indexOf(y); //-1

因此,您可以尝试以下操作:

if(filters.indexOf(Kinetic.Filters.RGB) !== -1)

1
从没想过这会起作用,因为我看到的所有内容都说indexOf只适用于字符串。最终我选择了另一种适合我的项目的解决方案,但知道这点还是很好的。在这里使用jsfiddle进行了测试:http://jsfiddle.net/q3umxbcz/ - user2924536

0
你也可以使用 some() 函数进行检查。
if(!filters.some((val) => {val == Kinetic.Filters.RGB}))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接