2016-02-23 3 views
19

У меня есть объект, который выглядит какКак вы связываете функции с помощью lodash?

var foundUser = { 
    charData: [] 
} 

который я загрузить объект из базы данных с помощью MySQL, а затем я называю

_.assignIn(foundUser, rows[0]); 

Но я получаю несколько дополнительных свойств, что я не необходимо (это не решаемая с помощью выбора)

Так я называю

foundUser = _.omit(foundUser, ['blah']); 

Но было бы неплохо, если бы я только мог сделать

_.assignIn(foundUser, rows[0]).omit(rows[0], ['blah']); 

Но выдает ошибку, я делаю это неправильно, или есть другой способ, это может быть сделано?

+1

https://lodash.com/docs#_ – zerkms

+2

https://lodash.com/docs#chain –

ответ

26

Для цепи с lodash, сначала нужно обернуть объект:

_(foundUser).assignIn(rows[0]).omit(['blah']).value(); 

Дальнейшее уточнение:

_ создает объект lodash который позволяет неявного метода построения цепочки. Неявное связывание методов означает, что в определенных обстоятельствах он может вернуть примитивное значение, в других он может вернуть объект lodash, который вам нужно развернуть, вызывая на нем .value().

Если вы используете _.chain(...), вы должны создать объект lodash с явным методом цепочки. Результат всегда является обернутым значением и всегда должен быть развернут, вызывая на нем .value().

Для дальнейшей ссылки здесь приведены ссылки на документацию:

Explicit chaining in Lodash

Implicit chaining in Lodash

+2

Не то, что я могу думать о причине вы нуждаетесь в этом, но есть также '_.chain (foundUser)', если вы хотите быть более явным. – Harangue

+0

собирался прокомментировать то же самое, у вас нет * have *, чтобы обернуть объект –

+1

@RobM. если вы делаете '_.chain()' вы все еще обертываете объект, это просто более явный – Kenneth

10

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

Попробуйте использовать _.flow.

Идея состоит в том, что каждая функция внутри flow получит в качестве входных данных результат предыдущего, что именно то, что вам нужно. Пример, учитывая эти данные:

var foundUser = { 
    charData: [] 
}; 

var rows = [{ok: 1, blah: 'nope'}]; 

Использование Lodash FP мы можем передать данные в качестве последнего аргумента. Эта функция наряду с автоматическим каррированием каждого метода в Lodash/fp облегчает нашу жизнь при составлении функций.Это означает, что мы можем иметь этот лаконичный и выразительный код:

_.flow(
_.assign(rows[0]), 
_.omit('blah') 
)(foundUser); 

// >> {"charData":[],"ok": 1} 

Используя стандартную версию Lodash мы должны Карри этих функций сам, используя _.partial, и код, безусловно, выглядит менее лаконичен, но это еще можно сделать так:

_.flow(
_.partialRight(_.assign, rows[0]), 
_.partialRight(_.omit, 'blah') 
)(foundUser); 

// >> {"charData":[],"ok": 1} 

Большое преимущество использования потока, а не цепочки является то, что вы можете легко смешивать методы Lodash с собственных функций, так - как сказала - все они нуждаются дзя данные й в качестве входных данных и данные в качестве вывода, и ничего больше:

const yourFunction = d => ({ ...d, yourProp: 4 }); 

_.flow(
_.assign(rows[0]), 
yourFunction, 
_.omit('blah') 
)(foundUser); 

// >> {"charData":[],"ok": 1, yourProp: 4} 

Это делает функцию композиции намного проще и более гибкой и, возможно, будет, естественно, приведет к более выразительной коде.

Еще одно примечание. Если вы устанавливаете и импортируете только те методы Lodash, которые вы используете, вам нужно будет добавить только пакет flow, а не всю библиотеку Lodash, как это было бы с цепочкой.

npm i --save lodash.flow 

Vs

npm i --save lodash 

Возможно незначительное преимущество во многих реальных приложениях, где имея полную сборку Lodash не является проблемой, и, возможно, легче поддерживать в актуальном состоянии, но очень удобно в случае, вы пишете библиотеку или скрипт, который будет распространяться для использования в качестве стороннего инструмента. В этом случае вы сможете снизить свой размер снизу по размеру.

Lodash методы документы:

Две статьи стоит проверить:

NB - название второй статьи немного резок на мой взгляд, но не пропустить его, содержание действительно очень информативен.

Несколько других вещей, чтобы отметить:

  • В Lodash/FPA Поток псевдонимами, как _.pipe, так что вы можете выбрать в зависимости от того вы предпочитаете.

  • Вы также можете использовать _.flowRight (или его псевдоним fp_.compose), если вы предпочитаете справа налево композиции, как видно в Ramda's compose.

Пример:

_.flow(
_.assign(rows[0]), // #1st to execute 
yourFunction, // #2 
_.omit('blah'), // #3 
)(foundUser); 

// is the same as... 

_.flowRight(
_.omit('blah'), // #3rd to execute 
yourFunction, // #2 
_.assign(rows[0]), // #1 
)(foundUser); 
0

Вы когда-нибудь пробовали lodash/fp? Он поставляется со всеми теми же функциями, но они карри и ни один из них не изменяет входные данные.

Из-за этого вы можете составить их по-настоящему красиво.

Пример:

import moment from 'moment' 
import { compose, filter, groupBy, size, sortBy } from 'lodash/fp' 

const fromAdmin = filter({ type: 'admin' }) 
const groupedByDate = groupBy(message => moment(message.createdAt).format('YYYYMMDD')) 
const sorted = sortBy('createdAt') 
const unreadByUser = filter({ isReadByUser: false }) 

const groupedMessages = compose(
    groupedByDate, 
    sorted, 
    unreadByUser, 
    fromAdmin, 
)(messages) 
Смежные вопросы