びぼーろくっ!

誰かに見せるわけでもないけど、備忘録として。。

javascriptの配列の関数を並べてみました。

殆どMDNからのパクリです。
なんとなくforEachで片付けてしまうところとかもあるし、必要に応じて使い分ければ冗長なコードを書かなくて済むし
なんとなく使いこなせたらかっこいい気がするw
ので、並べてみました。分からなかったらMDNや他のサイトに飛んでください。

足りないものがあれば追記していく予定です。


concat
配列と配列を結合する。
戻り:配列インスタンス
配列以外の値を引数に指定した場合、末端にappendされる。
引数に何も指定してなければ、新しい配列がコピーされる。

    const arr = ['a', 'b', 'c', 'ab', 'bc'];
    const concat = arr.concat(['d', 'e']);
    // concat: ['a', 'b', 'c', 'ab', 'bc', 'd', 'e']
    const concat2 = arr.concat('d');
    // concat2: ['a', 'b', 'c', 'ab', 'bc', 'd']
    const concat3 = arr.concat();
    // concat3: ['a', 'b', 'c', 'ab', 'bc']

every
引数に渡されたcallback関数を実行。
callback内でfalseがl返されたらその時点でループは終了。戻りはfalseとなる。
ループ終了後、falseがなければ戻りはtrueとなる。

    const arr = ['a', 'b', 'c', 'ab', 'bc'];
    const every = arr.every((val) => {
      return typeof val === 'string';
    });
    //  every: true;
    const every2 = ['a', 'b', 'c', 'ab', 1, 'bc'].every((val) => {
      return typeof val === 'string';
    });
    //  every2: false;

filter
引数に渡されたcallback関数を実行。
戻り:条件に一致する配列の要素を返却し、新しい配列を作成する。

    const arr = ['a', 'b', 'c', 'ab', 'bc'];
    const filter = arr.filter((val) => {
      return val.indexOf('a') !== -1;
    });
    //  filter: ['a', 'ab'];

forEach
callBackの関数を順番に実行する。
戻りはvoid;

    const arr = ['a', 'b', 'c', 'ab', 'bc'];
    let forEach = '';
    arr.forEach((val, i) => {
      forEach += val;
      forEach += (i !== arr.length - 1) ?
        'と' : '';
    });
    //  forEach: aとbとcとabとbc

indexOf
配列の要素の中から完全一致するものを探す。
戻りは要素の最初の添字(位置)存在しない場合は-1

    const arr = ['a', 'b', 'c', 'ab', 'bc'];
    const indexOf = arr.indexOf('ab');
    //  indexOf : 3

join
配列と配列を結合して文字列に返却。
対象の配列が空の場合は空文字を返却

    const arr = ['a', 'b', 'c', 'ab', 'bc'];
    const join = [].join();
    //  join : '' //空文字

    const join2 = [].join(',');
    //  join2 : '' //空文字

    const join3 = arr.join();
    //  join3: a,b,c,ab,bc

    const join4 = arr.join('と');
    //  join4: aとbとcとabとbc

lastIndexOf
配列の要素の中から完全一致するものを探す。
戻りは要素の添字(位置)存在しない場合は-1
indexOfとの違いは見つかった最後の添字という点。

    const arr = ['a', 'b', 'b', 'c'];
    const lastIndexOf = arr.lastIndexOf('b');
    //  lastIndexOf : 2

    //  ちなみにindexOfでは
    const indexOf = arr.indexOf('b');
    //  indexOf : 1;

map
全ての配列要素に対し処理をし、その結果新しい配列の結果を返却する。
forEachだと冗長な処理になりがちだが、これを使用するとスッキリかけることがある。

    const numArr = [2, 3, 4, 5];
    const map = numArr.map((val) => {
      return val * 2;
    });
    //  map : [4, 6, 8, 10];

pop
配列から最後の要素を取り出し、取り出した要素を戻りとして返却する。
もし配列が空だった場合、戻りはundefinedになる。

    const arr = ['japan', 'america', 'rusia'];
    const pop = arr.pop();
    //  arr: ['japan', 'america'] // 末端の要素が取り出されて配列数が1減る。
    //  pop: 'rusia'

push
配列に要素を追加する。戻りは追加後の配列数。

    const arr = ['japan', 'america', 'rusia'];
    const push = arr.push('germany');
    //  push : 4
    //  arr: ['japan', 'america', 'rusia', 'germany']

reduce
アキュムレータと配列の各要素に対して(左から右へ)関数を適用し、単一の値にする。
ちょっと理解ができないので、実際に書いてみる。

    const numArr = [2, 3, 4, 5];
    const reduce = numArr.reduce((preVal, crrVal, index) => {
      console.log(`${index}: preval:${preVal} crrVal:${crrVal}`);
      return preVal + crrVal;
    });
    //  1: preval:2 crrVal:3
    //  2: preval:5 crrVal:4
    //  3: preval:9 crrVal:5
    //  reduce: 14

まずpreviousValueとcurrentValueを使用して処理を実施して、
その結果がpreValに代入されている。
crrValは前回のcrrValの次の要素・・・。ということでいいのか?
なんとなくわかったような。そうではないような。。。
と思ったけど、こんな使い方なら良さそう。

    //  二次元配列を一次元配列にする
    const associativeArray = [['a', 'b'], ['c', 'd'], ['e', 'f']];
    const reduce2 = associativeArray.reduce((preArr, crrArr) => {
      return preArr.concat(crrArr);
    });
    //  reduce2: ['a', 'b', 'c', 'd', 'e', 'f']

reduceRight
reduceとは逆で右から左へと処理の順番が異なる。それ以外は同じ。

    const associativeArray = [['a', 'b'], ['c', 'd'], ['e', 'f']];
    const reduceRight = associativeArray.reduceRight((preArr, crrArr) => {
      return preArr.concat(crrArr);
    });
    //  reduceRight: ['e', 'f', 'c', 'd', 'a', 'b']

reverse
配列を逆さまにする。最初の配列要素が最後、最後の要素が最初。という感じ。
また、新しい配列インスタンスは作らないので、元の配列の順序も変わります。

    const arr = ['a', 'b', 'c', 'ab', 'bc'];
    const reverseArr = arr.reverse();
    //  arr: ['bc', 'ab', 'c', 'b', 'a']

shift
配列の最初の要素(0番目)を取り除き、取り除かれたあとの配列の要素の添字は1マイナスになる。
popの反対というイメージ。

    const arr = ['japan', 'america', 'rusia'];
    const shift = arr.shift();
    //  arr: ['america', 'rusia']
    //  shift: 'japan'

slice
配列の一部を取り出して新しい配列を作成。
配列のシャローコピーも可能。

    const arr = ['japan', 'america', 'rusia', 'germany', 'france'];
    //  begin・・・取り出す位置
    //  end・・・どこまで取り出すかを決めた位置

    //  slice(1, 3) は1番目の要素から4番目の要素まで
    //  (添字が 1, 2, の要素) を取り出します。
    const slice = arr.slice(1, 3);
    //  slice: ['america', 'rusia']
    //	arr: ['japan', 'america', 'rusia', 'germany', 'france'];
    //  元の配列に変更は加えないので、arrは変わることはない。

シャローコピーの実施と確認

    const arr = ['japan', 'america', 'rusia', 'germany', 'france'];
    const slice = arr.slice();
    
    //  配列の要素内の比較
    const result = JSON.stringify(arr) === JSON.stringify(slice);
    console.log(result); // true
    
    //  きちんと値渡しになっているかを確認
    slice[0] = 'finland';
    const result2 = JSON.stringify(arr) === JSON.stringify(slice);
    console.log(result2); // false

sort
配列を並び替えする。

    const arr = ['japan', 'america', 'rusia'];
    arr.sort();
    //  sortArr: ['america', 'japan', 'rusia']
    
    const numArr = [2, 10, 3, 100];
    numArr.sort();
    //  numArr: [10, 100, 2, 3]

どうやら数字も文字列としてみているような挙動なので、
数字のソートはcallbackで対応する。

    // callBackでaとbを比較してあげるだけで簡単にソートできる。
    const numArr = [2, 10, 3, 100];
    numArr.sort((a, b) => {
      return a - b;
    });
    //  numArr: [2, 3, 10, 100]
    //  a - bをb - aにすると降順になる。

some
引数に渡されたcallback関数を実行。
callback内でtrueがl返されたらその時点でループは終了。戻りはtrueとなる。
ループ終了後、trueがなければ戻りはfalseとなる。

    const arr = ['a', 'b', 'c', 'ab', 'bc'];
    const some = arr.some((val) => {
      return typeof val === 'number';
    });
    //  some: false;
    const some2 = arr.some((val) => {
      return typeof val === 'string';
    });
    //  some2: true;

splice
説明が厄介な関数。
古い要素を取り除きつつ新しい要素を追加することで、
配列の内容を変更します。
とMDNには記載があるが分かりづらいのでソースに落とし込みます。

spliceの引数は3つ
array.splice(index, howMany, [element1][, ..., elementN]);


index: 配列を変化させ始める要素の添字。arr.lengthより大きい場合、arr.lengthと同じ値
値が負数の場合、配列の終端からその値を引いた数が開始位置となる。

howMany: 配列から取り除く要素の数を示す。0の場合は取り除かれない。
引数無しの場合、index以降の全ての要素が取り除かれる。

element1, ...elementN
追加する要素。要素指定がなければ配列から要素を取り除く

戻りは取り除かれた配列。何も取り除かれなかった場合、空配列が返却される。

    // 空の配列を返却。
    const arr = ['japan', 'america', 'rusia'];
    const splice = arr.splice();
    //  splice: []
    //  arr: ['japan', 'america', 'rusia']
    // 2番目以降の配列を全て取り除く
    const arr = ['japan', 'america', 'rusia'];
    const splice = arr.splice(1);
    //  splice: ['america', 'rusia']
    //  arr: ['japan']
    //  2番目(index)の位置に0個(howMany)取り除き、germany(elem)を追加する。
    const arr = ['japan', 'america', 'rusia'];
    const splice = arr.splice(1, 0, 'germany');
    //  splice: []  // 何も取り除かれていない。
    //  arr: ['japan', 'germany', america', 'rusia']
    //  2番目(index)の位置に1個(howMany)取り除く。
    const arr = ['japan', 'america', 'rusia'];
    const splice = arr.splice(1, 1);
    //  splice: ['america']
    //  arr: ['japan', 'rusia']
    //  2番目(index)の位置に1個(howMany)取り除き、germany(elem)を追加する。
    const arr = ['japan', 'america', 'rusia'];
    const splice = arr.splice(1, 1, 'germany');
    //  splice: ['america']
    //  arr: ['japan', 'germany', 'rusia']
    //  1番目(index)の位置に2個(howMany)取り除き、germany(elem)を追加する。
    const arr = ['japan', 'america', 'rusia'];
    const splice = arr.splice(0, 2, 'germany');
    //  splice: ['japan', 'america']
    //  arr: ['germany', 'rusia']

unshift
配列の最初に要素を追加し、新しい配列数を返却します。

    const arr = ['japan', 'america', 'rusia'];
    const unshift = arr.unshift('germany');
    //  unshift: 4
    //  arr: ['germany', 'japan', 'america', 'rusia']