' P '

whatever I will forget

JavaScript filterとmap関数を使ったArrayの作り方

JavaScriptの記法に混乱させられます...

filterとmapを使って条件に対するデータのみ抽出し、map関数にて新しい配列として作る

const array = new Array();

// @param string data
function addProp(data) {
  array.push(name: data, valid: false);
}

function filteredArray() {
  return array.filter(data => !array.valid).map(newData => newData.name);
}

解説

arrayは二つのproperty(object)を持つ配列.
filterはそのarrayの中のdataを見て、validがfalseのものだけを抽出する
mapにて、filterされた結果にてproperty(object)のnameの値のみを使って新しい配列を生成している

混乱しがちな仕様:仮引数

filterや、mapに渡す引数は自由です。
よく、上記の関数に渡されている変数名、一体どこからやってきたんだ... と絶望しそうになるのですが、
ただの仮引数です。なんでもいいです。
例えばforループ時に現在参照している変数名を指定する感じと同じはずです.

filterにはcallback関数を渡せる

22/8/22追記.
混乱したのですが、例えば下記のようなテストコードがある場合.

const numbers = [1,2,3,4];
assert.deepStrictEqual(numbers.filter(moduleName.isDividedByTwo), [2,4]);

実行される側.

function isDividedByTwo(number) {
  return number % 2 === 0;
}

混乱しません?
isDividedByTwo関数には引数があるのにテストコードにはisDividedByTwoに引数を渡していません.
これ、filter()に関数を渡してそこでfilterした結果を渡しています.
こんなこともできるんですね、となったわけであります.

stackoverflow.com

ちなみに、上記は下記の書き方と同じのようです.

numbers.filter(numbers => moduleName.isDividedByTwo(numbers))