Как вы связываете функции с помощью lodash?
У меня есть объект, который выглядит как
var foundUser = {
charData: []
}
который затем я загружаю объект из базы данных с помощью mysql, а затем вызываю
_.assignIn(foundUser, rows[0]);
Но я получаю несколько дополнительных свойств, которые мне не нужны (это не разрешено с помощью select)
Поэтому я называю
foundUser = _.omit(foundUser, ['blah']);
Но было бы неплохо, если бы я мог просто сделать
_.assignIn(foundUser, rows[0]).omit(rows[0], ['blah']);
Но это вызывает ошибку, я делаю это неправильно или есть другой способ, которым это можно сделать?
Ответы
Ответ 1
Чтобы подключиться к lodash, сначала нужно обернуть объект:
_(foundUser).assignIn(rows[0]).omit(['blah']).value();
Дальнейшие разъяснения:
_
создает объект lodash, который допускает неявное связывание методов. Неявное связывание методов означает, что при определенных обстоятельствах оно может возвращать примитивное значение, в других - возвращать объект lodash, который нужно развернуть, вызывая .value()
на нем.
Если вы используете _.chain(...)
, вы должны создать объект lodash с явной цепочкой методов. Результат всегда является завернутым значением и всегда должен быть развернут, вызывая .value()
на нем.
Для получения дополнительной информации см. ссылки на документацию:
Явная цепочка в Lodash
Неявная цепочка в Lodash
Ответ 2
В качестве альтернативы шаблону разворачивания цепочки-цепочек (ничего из этого не происходит, но альтернативы всегда интересны), есть другой способ, который вы можете проверить.
Попробуйте использовать _.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 не является проблемой и, возможно, проще поддерживать в актуальном состоянии, но очень удобна, если вы пишете библиотеку или script, которые будут распределяться для использования в качестве стороннего инструмента. В этом случае вы сможете сохранить свой снимок ниже по размеру.
Методы Lodash docs:
Две статьи, заслуживающие проверки:
NB - название второй статьи немного суровое по моему мнению, но не пропускайте ее, содержание действительно очень информативно.
Несколько других замечаний:
-
В Lodash/fp Flow псевдоним как _.pipe
, поэтому вы можете выбрать тот, который вы предпочитаете.
-
Вы также можете использовать _.flowRight
(или его fp
alias _.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);
Ответ 3
Вы когда-нибудь пробовали 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)