Подтвердить что ты не робот

Как вы связываете функции с помощью lodash?

У меня есть объект, который выглядит как

var foundUser = {
    charData: []
}

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

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

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

Поэтому я называю

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

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

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

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

4b9b3361

Ответ 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)