uebu-kaihatsu.jp.net

lodashを使用して関数をチェーンするにはどうすればよいですか?

次のようなオブジェクトがあります

var foundUser = {
    charData: []
}

次に、mysqlを使用してデータベースからオブジェクトをロードし、呼び出します

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

しかし、私は必要のないいくつかの追加のプロパティを取得します(これはselectを使用して解決できません)

だから私は電話する

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

でも、できたらいいですね

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

しかし、それはエラーをスローします、私はそれを間違っていますか、これを行うことができる別の方法がありますか?

42
Datsik

Lodashでチェーンするには、まずオブジェクトをラップする必要があります。

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

さらなる解明:

_は、暗黙的なメソッドチェーンを可能にするlodashオブジェクトを作成します。暗黙的なメソッドチェーンとは、特定の状況でプリミティブ値を返す場合もあれば、.value()を呼び出してラップ解除する必要があるlodashオブジェクトを返す場合もあります。

_.chain(...)を使用する場合、明示的なメソッドチェーンを使用してlodashオブジェクトを作成します。結果は常にラップされた値であり、その上で.value()を呼び出すことによって常にラップを解除する必要があります。

詳細については、ドキュメントへのリンクを参照してください。

Lodashでの明示的な連鎖

Lodashの暗黙的な連鎖

68
Kenneth

Wrap-chain-unwrapパターンの代替として(本質的に何も問題はありませんが、代替は常に興味深いです)、確認できる別の方法があります。

_.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メソッドのみをインストールおよびインポートする場合は、チェーンで行うようにLodashライブラリ全体ではなく、flowパッケージのみを追加する必要があります。

npm i --save lodash.flow

npm i --save lodash

おそらく、Lodashのフルビルドが問題ではなく、間違いなく最新の状態に維持するのが簡単ですが、使用するために配布されるライブラリまたはスクリプトを作成する場合には非常に便利な多くの実際のアプリケーションでの無視できる利点サードパーティのツール。その場合、分散サイズに関してフットプリントを低く抑えることができます。

Lodashメソッドのドキュメント:

チェックアウトする価値のある2つの記事:

NB-2番目の記事のタイトルは私の意見では少し厳しいですが、それをスキップしないでください。内容は確かに非常に有益です。

その他の注意事項:

  • Lodash/fpでは、フローは_.pipeとしてエイリアスされるため、好きなものを選択できます。

  • Ramda's compose に見られるように、右から左への構成を希望する場合は、_.flowRight(またはそのfpエイリアス_.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);
23
Nobita

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)
5
Daniel