Удаление многочисленных циклов for из кода Javascript - PullRequest
4 голосов
/ 02 марта 2012

Я пишу некоторый код для веб-приложения, которому регулярно требуется фильтровать массив объектов javascript для возврата подмножества объектов. Я обнаружил, что во всем моем коде я получаю множество циклов for. Я планирую написать функцию-прототип, которая может возвращать отфильтрованное подмножество, используя переданную функцию, аналогично лямбда-выражению LINQ в C # или фильтру Scala, но я не могу не думать, что это уже сделано, либо на базовом языке, либо на внешняя библиотека и я заново изобретаю колесо.

Есть ли предпочтительный способ функционально вернуть отфильтрованное подмножество объектов Json без циклов for, засоренных в моем коде. Синтаксис не актуален, но конструкция и концепция похожи на:

var filteredObj = obj.filter(function() {... filter function ...});

Ответы [ 4 ]

3 голосов
/ 02 марта 2012

Вы смотрели на подчеркивание ?

Существует множество функциональных инструментов программирования, включая map, filter и reduce

.

В этой библиотеке есть масса замечательных утилит, которые делают JavaScript немного более функциональным.

2 голосов
/ 02 марта 2012

jQuery имеет функцию grep() , которая может фильтровать массив объектов.

Все становится ужасно, когда вам нужна рекурсия или когда вы хотите фильтровать атрибуты каждого объекта, потому что тогда функция фильтрации может зависеть от контекста.

0 голосов
/ 05 ноября 2012

Если вы нацелены на аудиторию браузера, которая поддерживает JavaScript 1.6 и выше map и filter являются частью основного языка и не нуждаются в поддержке библиотеки.Интересно, что JavaScript 1.8 также вводит метод уменьшения массива в основной язык.

0 голосов
/ 02 марта 2012

Это на самом деле очень хорошая идея.Вы могли бы сделать что-то вроде этого

Array.prototype.Where = function(filterFn){

   var i, results = [];

   for (i = 0; i < this.length; ++i){
      if (filterFn.call(this, this[i])){
          results.push(this[i]);
      }
   }

   return results;
};

. Тогда бы у каждого массива в вашем json был метод Where, который вы могли бы использовать для фильтрации (так же, как linq).

...