2015-08-31 7 views
0

Как передать массив методу фильтра в JavaScript?передать массив методу фильтрации

Например, я хочу фильтровать массив с другим массивом. Теперь у меня работает мой код, но я не передаю массив, мой массив фильтров имеет глобальную область. Есть ли способ передать массив, чтобы иметь более чистый код?

var array = [1, 2, 3, 4, 5]; 
var filterNumbers = [1, 4]; 

var result = array.filter(filterData); 

function filterData(value) { 
    return filterNumbers.indexOf(value) === -1; 
} 
+0

Возможный дубликат [jQuery/JavaScript: фильтр массив с другим массивом] (http://stackoverflow.com/questions/18894241/jquery-javascript-filter-array-with-another-array) – Dalorzo

+0

Почему вы хотите передать массив в другую функцию? Вот как работает ООП. Вы используете метод '.filter', который принадлежит массиву для фильтрации массива. Это уже очень чисто (чистейшее imo) и легко понять. –

+0

Не прямой ответ, но я настоятельно рекомендую вам не пытаться реализовать это самостоятельно. Такие проекты, как http://underscorejs.org/ или https://lodash.com/, имеют множество функций, которые помогут вам выполнять подобные действия, и эти проекты прикладывают много усилий и времени, чтобы заставить их работать хорошо. – CodingGorilla

ответ

3

Вы можете сделать это с помощью частичного применения (fiddle):

function filterUsing(filterByArray) { // get the array to filter by 
    return function(value) { // return a filtering function 
     return filterByArray.indexOf(value) === -1; 
    }; 
} 

var filterFunc = filterUsing(filterNumbers); // get the function using your filterNumbers array 

var result = array.filter(filterFunc); 
+0

Спасибо за ваш быстрый ответ, ваш код работает для меня. Он выглядит чище и хорошо объяснен. Это мне очень помогло. –

1

вы можете использовать анонимную функцию:

var array = [1, 2, 3, 4, 5]; 
var filterNumbers = [1, 4]; 
var result = array.filter(function(value) { 
    return filterNumbers.indexOf(value) === -1; 
}); 
0

Короткий ответ: НЕТ.

Метод filter ожидает функцию обратного вызова в качестве аргумента. https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/filtro

Также не имеет смысла, что javascript будет определять, что вы хотите сделать, просто передав массив. Для того, чтобы чистящее кода вы можете передать анонимную функцию:

var array = [1, 2, 3, 4, 5]; 
var filterNumbers = [1, 4]; 

var result = array.filter(function() { 
return filterNumbers.indexOf(value) === -1; 
}); 
0

Я думаю, что вам лучше всего это функция, которая возвращает фильтрацию функция:

function filterFN(numbers) { 
    return function(value) { return number.indexOf(value) === -1; }; 
} 

var array = [1, 2, 3, 4, 5]; 
var result = array.filter(filterFN([1,4])); 
1

Вы можете создать функцию для возврата обратного вызова, который используется для фильтрации массива. Таким образом, вы нарушаете зависимость между filterNumbers и самой функцией фильтра.

См:

var array = [1, 2, 3, 4, 5]; 
 
var filterNumbers = [1, 4]; 
 

 
var result = array.filter(myFilter(filterNumbers)); 
 

 
function myFilter(mynumbers){ 
 
    return function filterData(value) { 
 
    return mynumbers.indexOf(value) === -1; 
 
    } 
 
} 
 

 
document.getElementById("test").innerHTML = JSON.stringify(result);
<div id="test"></div>

Я надеюсь, что это помогает. Счастливое кодирование!

+0

Спасибо за ваш ответ. Он работает также. –

Смежные вопросы