2013-05-18 2 views
0

В настоящее время я использую $.grep для фильтрации и удаления элементов из массива, который я передаю. Я считаю, что $ .grep предназначался для фильтрации только, но поскольку он выполняет итерацию по всему массиву, я решил, что могу изменить массив внутри него.

Есть ли у вас какие-либо другие подходы, которые вы можете предложить? У меня была мысль о $.map, но AFAIK он должен использоваться для перевода элементов, а не для их удаления.

Является ли отдельный $.each моей единственной альтернативой?

Соответствующая часть моего кода:

$.each(filter, function (k, v) { 

    if (v.codeKeys) { 

     $.each(v.codeKeys, function (i, codeKey) { 

      rows = $.grep(rows, function (v2, i2) { 

       if ($.isArray(v2[v.dbColumn]) && 
        $.inArray(codeKey, v2[v.dbColumn]) === -1) { 

        var index = $.inArray(codeKey ,v2[v.dbColumn]); 

        if (v2[v.dbColumn][index]) 
         v2[v.dbColumn].remove(index); 

        return true; 

       } 
       else { 
        return v2[v.dbColumn] !== codeKey; 
       } 

      }); 

     }); 
    } 

}); 

ответ

1

$ .map могут быть использованы для удаления элементов из массива, просто сделать его возвращать нуль:

var items = [1, 2, 3, 4] 
$.map(items, function(i) { if (i == 2) return null; return i; }) 

result: [1, 3, 4] 

От the documentation:

The function can return: 
    * the translated value, which will be mapped to the resulting array 
    * null or undefined, to remove the item 
+0

ОК, поэтому я думаю, что это сводится к читаемости и производительности. '$ .map' создаст дополнительный цикл, улучшая читаемость. – Johan

+0

@Johan: Имейте в виду, что это поведение не соответствует стандартному методу '.map'. Итераторы jQuery отклоняются от спецификационных эквивалентов различными способами. –

+1

Спасибо за головы. Я бы сказал, что вещи, которые jQuery изменили на своих версиях стандартных методов массива, как правило, упрощают работу разработчиков. – Johan

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