2015-01-25 3 views
2

У меня есть объект изображения 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.

Так что 2 вопроса, есть ли что-нибудь, чтобы проверить с чем-то вроде Array.indexOf, что имя функции уже существует в массиве? или в KineticJS уже есть какой-то готовый метод, которого я не видел?

ответ

3
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

Вы также можете проверить с помощью функции некоторых().

if(!filters.some((val) => {val == Kinetic.Filters.RGB})) 
Смежные вопросы