2016-04-18 2 views
3

Я использую array.protoype.filter method и возвращает пустой массив.Javascript filter возвращающий пустой массив

function isSelected(value){ 

     var tagString = $(value).attr('class'); 
     $.each($(brandDrop.selections), function(index, brand) { 
     if(tagString.indexOf(brand) >= 0) { 
      console.log(tagString); 
      return tagString; 
     } 
     }); 

    } 

    var products = []; 
    $.each($('.products li'), function(index, product){ 
     products.push(product); 
    }); 

    var brandFiltered = products.filter(isSelected); 
    console.log(brandFiltered); 

Вот выход консоль для tagstring внутри цикла и brandFiltered вне цикла:

AugustaCollection,Crib,publishSK,simmons,simmons-kids,wood 
cribs:2058 BellanteCollection,Crib,publishSK,simmons-kids,wood 
cribs:2058 BelmontCollection,Crib,publishSK,simmons-kids,wood 
cribs:2082 [] 

Эта функция вызывается путем выбора флажка. Что этот фильтр должен сделать, так это взять массив элементов html, проверить их атрибут класса на наличие выбранного значения и вернуть только имена классов для элементов, которые соответствуют критериям фильтра. Журнал консоли в цикле показывает правильные элементы, но по какой-то причине пустой цикл возвращается за пределы цикла. Я неправильно использую метод фильтра?

+3

Ваш 'метод isSelected' ничего не возвращает (' undefined') –

ответ

2

Ваша строка return tagString; возвращает результат функции $.each, ваша функция isSelected в настоящее время ничего не возвращает.

Вы можете отредактировать эту функцию для выполнения проверки и вернуть true, когда строка найдена.

function isSelected(value){  
     var tagString = $(value).attr('class'); 
     var foundString = false; 
     $.each($(brandDrop.selections), function(index, brand) { 
     if(tagString.indexOf(brand) >= 0) { 
      console.log(tagString); 
      foundString = true; 
     } 
     }); 
     return foundString; 
    } 

фильтр работает по-разному, чем-то вроде карты, он используется только для уменьшения размера вашего массива путем проверки на состояние и возвращает истину или ложь. Если вы хотите иметь только массив классов, которые вы можете отобразить после фителя.

brandFiltered = brandFiltered.map(function(x){ return $(x).attr('class'); }); 
+0

ли он фильтровать массив, но вернуть весь элемент, когда вы хотите только классы? Добавлен комментарий для создания карты после фильтра, чтобы получить массив имен классов. – IrkenInvader

+1

Спасибо, что он работает сейчас! –

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