2014-09-28 3 views

ответ

3

Что происходит, что filter принимает несколько аргументов, которые неявным применяются в композиции, но не в применении:

// what it looks like 
.filter(_.partialRight(_.has, 'a')) 

// what's happening 
.filter(function(o,i,xs){return _.partialRight(_.has,'a')(o,i,xs);}) 

Смотрите здесь http://plnkr.co/edit/Q2Gz5vllUufzRvUuhqDQ?p=preview

+3

Почему, по вашему мнению, это проблема с 'partialRight'? Он прикрепляет 'a' к * концу * массива сложенных аргументов, то есть после' o, i, xs'. Это означает, что '_.has' получает' i' в качестве второго аргумента. – DCoder

+0

@DCoder: '_.partialRight (_. Has, 'a')' должен возвращать функцию, ожидающую одного аргумента. Кажется, это может занять более одного. Правильно? – elclanrs

+1

"должен возвращать функцию, ожидающую одного аргумента" - должно ли это? Он возвращает функцию, которая принимает любое количество аргументов, которые добавляются частично. Фактический вызов выглядит так: '_.has (o, i, xs, 'a')'. По сравнению с '_.has (o, 'a')' (поэтому на самом деле вызовы возвращают разные результаты) – zerkms

1

Этот ответ является дополнением к @elclanrs 'one:

Вот как вы могли бы сделать то, что вы хотите без создания анонимной функции:

result1 = _(objects) 
    .filter(_.compose(_.partialRight(_.has, 'a'), _.identity)) 
    .value(); 

Объяснение:

_.compose() функция принимает число ссылок функции и применяет их по другому, проходя результат выполнения от предыдущей функции до следующей. Функция _.identity() возвращает первый переданный аргумент.

Так что, если мы разворачивать выражение _.compose(_.partialRight(_.has, 'a'), _.identity) это будет выглядеть следующим образом:

function (a, b, c) { 
    return _.partialRight(_.has, 'a')(_.identity(a, b, c)); 
} 

Интернет демо: http://plnkr.co/edit/kU3MkrfSJol9c9JbGBqo?p=preview

Ссылки: