LoginSignup
22
15

More than 3 years have passed since last update.

Enumerable.Linq の各メソッドを JavaScript ではどう書くか?(メソッドの対応)

Last updated at Posted at 2020-02-18

はじめに

内容は随時補完されます!
.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 (配列添字情報つき)

C#
var req = new[] { 160, -2, 0, 5 };
var res = req.Select((s, i) => s * i);
// -> { 0, -2 , 0, 15 }
JavaScript
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* を使用できます。

JavaScript
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本

さいごに

間違いのご指摘、便利な書き方、ぜひぜひお寄せ下さいませ!

参考情報 ありがとうございます!


  1. 配列風オブジェクト (length プロパティおよびインデックス付けされた要素を持つオブジェクト (Array.from - MDN より) 

  2. MapSet のような要素を取得するオブジェクト(Array.from - MDN より) 

22
15
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
15