web-dev-qa-db-ja.com

Underscore.js関数をチェーンするための好ましい方法は何ですか?

Underscore.jsには、関数を呼び出す2つの方法があります。これを、オブジェクトスタイルと関数スタイルと呼びます。オブジェクトスタイルは次のようになります。

__(myObject).each(function (val, key) {
  console.log(key, val);
});
_

一方、関数スタイルは次のようになります。

__.each(myObject, function (val, key) {
  console.log(key, val);
});
_

私はコードでオブジェクトスタイルの呼び出しをうまく使用していましたが、ある時点で、オブジェクトスタイルの呼び出しがunderscore.jsドキュメントから消えました(オブジェクトスタイルの呼び出しはまだ完全に機能します)。また、関数スタイルが「より良い」または「優先される」というヒントも(backbone.jsのドキュメントのように)見ました。

それで、関数スタイルの呼び出しは好ましいメソッドですか?もしそうなら、誰かがこれの背後にある理由を説明できますか?

更新: @ ggozadは私の質問に部分的に答えました。しかし、underscore.jsがどのように機能するかについての私の理解は、バージョン0.4.2の頃に形成されたようです。 underscore.jsの変更履歴を読むと、バージョン1.2.4の次のエントリが表示されます。

これで、_.chain(list)の代わりに_(list).chain()を書くことができます(おそらくそうすべきです)。

_.chain(list)の代わりに_(list).chain()を書く必要がある理由を知りたいのですが。

25

@ggozadによる答えは、実際には非常に誤解を招くものです。オブジェクト指向のスタイルは、連鎖とは何の関係もありません。与えられた例:

__([1,2,3]).map(function (item) { return item * 2; }).map(function (item) { return item*3;});
_

実際にはアンダースコアチェーンをまったく使用していません!組み込みのJS配列オブジェクトに独自のmap()関数があるためにのみ機能します。組み込みではない関数(シャッフルなど)を試してみると、機能が壊れていることがわかります。

__([1,2,3]).shuffle().shuffle();
_

アンダースコアチェーンを取得する唯一の方法は、chain()を呼び出すことです。これは、いずれかのスタイル(OOまたは関数)を使用して実行できます。

ドキュメントに__.chain_を使用する必要があると記載されている理由については、これは単なるスタイル設定だと思います。明確にするために GitHubでの問題 を開きました。

32
Russell Davis

いつ _は、基本的に引数をラップする関数として使用されます。ラッパーは、すべての通常アンダースコア関数を提供します。

スタイルとの違いは、OOPスタイル(または定義内のオブジェクトスタイル)を使用すると、チェーン可能なラップされたオブジェクトが生成されることです。したがって、簡単に実行できます。

_([1,2,3]).map(function (item) { return item * 2; }).map(function (item) { return item*3;});

同等のものは次のようになります。

_.map(_.map([1,2,3], function (item) { return item * 2 }), function (item) { return item * 3 });

これはおそらくあまり明確ではありません。

0
ggozad