web-dev-qa-db-ja.com

underscore.jsの_.identity(value)の使い方を説明してください

Underscore.jsの_.identity(value)の使い方を説明してください。ドキュメントからは理解できません( http://underscorejs.org/#identity )。

その使用例をいくつか挙げていただけますか?

22
SunnyShah

これは本質的に操作なしの機能です。渡されたものの値を返します。

ライブラリ自体の中で「デフォルトのイテレータ」として使用されている部分は、オプションの「イテレータ」パラメータを持つ可能性のある他の関数(ある種の配列の各要素に適用する関数として使用される可能性が高い)を意味します。 、イテレータパラメータが渡されない場合、ライブラリは代わりにこの「no-op」イテレータを使用し、配列の要素は変更されません。

13
Matt Sach

IDを含むJavaScriptコードパターンは、真実性に基づいて値をフィルタリングしています。

var a = [null, null, [1,2,3], null, [10, 12], null];

a.filter(_.identity) 

[Array [3]、Array [2]]を生成します。

使用する

_.compact(a)

より明確ですが、lodashやunderscoreをまったく使用しない場合があります。

function identity(x) { 
   return x; 
}

a.filter(identity)

それが良いコードパターンであるかどうかはいくつかの理由で疑わしいですが、それは実際に使用されています。

それはNOOPではありません。 NOOPは、たとえば次のような命令型の構造です。アセンブリ、関数型プログラミングでは、値を返すという点で他の関数と同じです。アイデンティティがNOOPである場合、すべての純粋関数もnoopと見なすことができ、それは賢明なことではありません。

39
Robert Monfera

具体例:

Underscore.jsは_.eachを次のように定義します。

_.each = function(obj, iterator, context) {
  ...
}

このイテレータはel値を示します。あなたはおそらくこのイディオムを使用したことがあります。

_.each([1, 2, 3], function(el){
  console.log(el);
});

このイテレータは、変更せずにel値を返します。

_.each([1, 2, 3], function(el){
  return el;
});

変更せずに値を返す関数が頻繁に発生します。そのため、Underscore.jsは関数を定義したいと考えています。 Underscore.jsは、関数に_.identityという名前を付けます。

_.identity = function(value) {
  return value;
};

Underscore.jsがデフォルトのイテレータを使用する場合、Underscore.jsに必要なのは_.identityを呼び出すことだけです。

_.each([1, 2, 3], _.identity);
12