#はじめに
内容は随時補完されます!
.NET の Linq に慣れ親しんでいる方向けに、JavaScriptでの似たメソッドへの対応を一覧化したものです。
Linq でいう「シーケンス」を、Javascript でいう「索引付きコレクション(配列など、インデックス値で順序付けされたデータのコレクション)」「配列風オブジェクト1」「キー付きコレクション(反復可能オブジェクト2)」のすべて、またはいずれかとほぼ同じとみなして対応させています。
#一覧
まったく同じ機能とは限らないので注意です。(元となる配列自体を書き換える(*マークつき)、メソッドチェーンにならない、同値判定・False判定法が違うなど)
Linq | JavaScript | JSでの機能 |
---|---|---|
Aggregate |
reduce reduceRight |
配列の各要素に対してreducer関数を実行して単一の値を返す 配列の各要素に対して右から左へreducer関数を実行して単一の値を返す |
All | every | 配列のすべての要素が、与えられた関数によって実行されるテストに通るかテストする |
Any | some | 配列の少なくとも1つの要素が、渡された関数によって実施されるテストに通るかテストする |
Append | *push concat |
配列自体の末尾に1つ以上の要素を追加する 配列に他の配列や値をつないだ新しい配列を返す |
Average | reduce で代用など | |
Cast | map で代用など | |
Concat | concat | 配列に他の配列や値をつないだ新しい配列を返す。2以上の配列や値も一度に指定可能 |
Contains | includes | 配列に特定の要素が含まれているかを返す |
Count | length | |
Distinct | Set オブジェクト生成など | |
Empty | [ ] | |
First | find | 配列内の、提供されたテスト関数を満たす最初の要素の値を返す。配列すべての要素にテスト関数が呼び出されるので注意。 |
FirstOrDefault | ↑ | |
Last | sort と find で代用など | |
LastOrDefault | ↑ | |
Max |
Math.max reduce で代用など |
引数として与えた複数の数の中で最大の数を返す |
Min |
Math.min reduce で代用など |
引数として与えた複数の数の中で最小の数を返す |
OrderBy | *sort | 配列自体の要素をソートする |
OrderByDescending | ↑ | |
Prepend | *splice | 配列自体の既存の要素を取り除いたり、置き換えたり、新しい要素を追加したりする |
Reverse | *reverse | 配列自体の要素を反転させて返す |
Select | map | 配列のすべての要素に対して与えられた関数を実行し、その結果からなる新しい配列を生成して返す |
SelectMany |
flat flatMap |
すべてのサブ配列の要素を指定した深さで再帰的に結合した新しい配列を生成して返す マッピング関数を使用してそれぞれの要素をマップした後、結果を新しい配列内にフラット化して返す |
Skip | *splice | 配列自体の既存の要素を取り除いたり、置き換えたり、新しい要素を追加したりする |
SkipLast | *splice | 配列自体の既存の要素を取り除いたり、置き換えたり、新しい要素を追加したりする |
SkipWhile | filter で代用など | |
Sum | redure で代用など | |
Take |
subarray slice |
指定される範囲から同じ要素の型をもつ新しい配列を生成して返す 配列の一部をシャローコピーして新しい配列オブジェクトを返す |
TakeLast | ↑ | |
TakeWhile | filter で代用など | |
ToArray | from | 「配列風オブジェクト1」や「反復可能オブジェクト2」から新しい浅いコピーのArrayインスタンスを生成して返す |
Where | filter | 各配列要素に対して、与えられたテスト関数を実行し、合格したすべての配列要素からなる新しい配列を生成して返す |
#対応例
##Select - map (配列添字情報つき)
var req = new[] { 160, -2, 0, 5 };
var res = req.Select((s, i) => s * i);
// -> { 0, -2 , 0, 15 }
let req = [16, -2, 0, 5];
var res = req.map(function(s, i) { return s * i; });
// -> [ 0, -2, 0, 15 ]
#補足
##linq.js
便利なライブラリがあるようです。
##ジェネレーター関数
.NET でいう IEnumerable<T>を戻り型とする関数と似た概念があり、function*と記載することで、yield (C# の yield return) や yield* を使用できます。
function* OneTwoThree(s) {
yield "1" + s;
yield "2" + s;
yield "3" + s;
}
for (let v of OneTwoThree("個")) { console.log(v); }
for (let v of OneTwoThree("本")) { console.log(v); }
// ->
// 1個
// 2個
// 3個
// 1本
// 2本
// 3本
#さいごに
間違いのご指摘、便利な書き方、ぜひぜひお寄せ下さいませ!
#参考情報 ありがとうございます!
-
配列風オブジェクト (length プロパティおよびインデックス付けされた要素を持つオブジェクト (Array.from - MDN より) ↩ ↩2
-
Map や Set のような要素を取得するオブジェクト(Array.from - MDN より) ↩ ↩2