2017-01-25 6 views
1

я на следующий рабочий код, написанный с lodash, последняя версияlodash - цепочки фильтров и Foreach

  _.forEach(_.filter($ctrl.data, ['x', 'y']), function (elem) { 
       ... 
      }); 

Если я пытаюсь превратить это в цепочку, она никогда не будет выполнять код блока внутри forEach.

  _.chain($ctrl.data) 
       .filter(['x', 'y']) 
       .forEach(function (elem) { 
        ... 
       }); 

Почему?

+0

если вы console.log '_.chain ($ ctrl.data) .filter (['x', 'y'])', что он возвращает? – Dani

+0

Я отлаживал использование '_.chain ($ ctrl.data) .filter (['x', 'y']). Value()' и возвращает отфильтрованный массив, как и ожидалось. – tzortzik

+0

, тогда вы должны попробовать '_.chain ($ ctrl.data) .filter (['x', 'y']). Value(). ForEach (function (elem) {..});' – Dani

ответ

1

Я исправил проблему, используя _($ctrl.data) вместо _.chain($ctrl.data). Я читал, что основное отличие здесь в том, что глобальная функция от lodash вызывает _.value(), когда в конце есть «функция терминатора».

Эквивалент с использованием _.chain будет заключаться в явном обращении _.value() до _.forEach(). Но все же не могу понять, в чем проблема, поскольку, с моей точки зрения, forEach является «функцией терминатора».

1

Я просто столкнулся с подобной проблемой. Я использовал синтаксис _(blah), и я все еще сталкивался с проблемами.

В моем случае код выглядит следующим образом:

_(items).forEach((x) => doSomething(x)); 

Оказывается doSomething возвращался в boolean. Я думаю, что lodash видит это возвращаемое значение и обрабатывает forEach так же, как map, не оценивая его. Тем не менее, я попытался наклеить на value() на конец, и я получаю ошибку value is not a function во время выполнения.

В моем случае проблема была решена путем оборачивания doSomething вызова:

_(items).forEach((x) => { doSomething(x); }); 

больше похоже на ошибку, чем ничего.