😎

【JavaScript】よく使う配列関連の処理まとめ

2023/12/19に公開

はじめに

JavaScriptで個人的によく使う配列関連の処理をまとめました。

処理一覧

配列が空かどうか判定する

const judgeArrayEmpty = array => {
  if (!array.length) {
    console.log('empty');
  } else {
    console.log('not empry');
  }
}

judgeArrayEmpty([]);        // empty
judgeArrayEmpty([0, 1]);    // not empty

結論

if (!array.length) {...}
if (array.length) {...}

参考

https://qiita.com/kozzzz/items/42108bc96b3a0e7c53d5

配列をコピーする

const array0 = [0, 1, 2];
const array1 = array0;        // bad
const array2 = [...array0];   // good

console.log(array0 == array1);                          // true
console.log(array0.toString() == array1.toString());    // true

console.log(array0 == array2);                          // false
console.log(array0.toString() == array2.toString());    // true

結論

[...array]

参考

https://zenn.dev/kou_pg_0131/articles/js-clone-array
https://typescriptbook.jp/reference/values-types-variables/array/spread-syntax-for-array

配列の重複をなくす

let array = [0, 1, 2, 0, 2, 3];
console.log(array);   // [0, 1, 2, 0, 2, 3]

array = [...new Set(array)];
console.log(array);   // [0, 1, 2, 3]

結論

[...new Set(array)]

参考

https://qiita.com/netebakari/items/7c1db0b0cea14a3d4419

配列やSetに特定の要素を含むか判定する

const array = ['apple', 'banana', 'orange'];
const set = new Set(array);

console.log(array.includes('banana'));    // true
console.log(array.includes('melon'));     // false

console.log(set.has('banana'));   // true
console.log(set.has('melon'));    // false

結論

array.includes(value)   // 配列
set.has(value)          // Set

Tips

配列の場合、Setに変換してから判定するのもあり(重複がない配列に限る)
Setのhas()メソッド実行コスト <<< 配列のincludes()メソッド実行コスト
(Set生成コストを考慮しても使う価値あり)

new Set(array).has(value)

参考

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/includes
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Set/has
https://qiita.com/kei-nakoshi/items/7d02eae7a0609faab85e

配列から特定の要素を削除する

let array0 = ['apple', 'banana', 'orange'];
let array1 = ['apple', 'banana', 'orange'];

array0.splice(2, 1);
console.log(array0);    // ['apple', 'banana']

array1.splice(0, 2);
console.log(array1);    // ['orange']

結論

array.splice(index, length)

Tips

  • 対象の配列自体を変えるメソッド(破壊的)なので、操作前の配列を今後も使いたい場合は slice()filter() を使う
  • splice() の戻り値は、第一引数と第二引数で指定した範囲の要素配列

参考

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

配列から特定の要素を抽出する

const array = ['apple', 'banana', 'orange', 'melon', 'peach'];

console.log(array.slice(3));                              // ['melon', 'peach']
console.log(array.slice(2, 4));                           // ['orange', 'melon']
console.log(array.filter(value => value.length == 5));    // ['apple, melon, peach]

結論

array.slice(start)
array.slice(start, end)
array.fliter(value => condition)

Tips

  • 添え字に基づく条件の場合は slice()
  • 要素値に基づく条件の場合は filter()

参考

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/slice
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

オブジェクト配列から特定のプロパティ値のみ(もしくはプロパティと値)を抽出する

const object = [
  { name: 'suzuki', 
    age: 30,
    mail: 'suzuki@exsample.com' },
  { name: 'saito',
    age: 25,
    mail: 'saito@exsample.com' },
  { name: 'takahashi',
    age: 33,
    mail: 'takahashi@exsample.com' }
];

const array = object.map(element => element.name);
console.log(array);       // [suzuki, saito, takahashi]

const newObject = object.map(({name, age}) => {
  return {name, age};
});
console.log(newObject);   // [
                          //  { name: 'suzuki', age: 30 },
                          //  { name: 'saito', age: 25 },
                          //  { name: 'takahashi', age: 33 },
                          // ]

結論

object.map(element => element.property)       // プロパティ値のみ抽出
object.map({property1, property2, ...} => {   // プロパティと値を抽出
  return {property1, property2, ...};
});

参考

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map
https://typescriptbook.jp/tips/get-a-subset-of-an-object
https://typescriptbook.jp/reference/values-types-variables/object/destructuring-assignment-from-objects

配列をソートする

const numbers = [5, 1, 3, 4, 2];
const alphabets = ['d', 'e', 'a', 'c', 'b'];
console.log(numbers);     // [5, 1, 3, 4, 2]
console.log(alphabets);   // ['d', 'e', 'a', 'c', 'b']


const sortArray = (array, isAsc) => {
  let direction = 1;
  if (!isAsc) {
    direction = direction * -1;
  }
  array.sort((a, b) => {
    if (a > b) {
      return direction * 1;
    }
    return direction * -1;
  });
  
  return array;
}

console.log(sortArray(numbers, true));      // [1, 2, 3, 4, 5]
console.log(sortArray(numbers, false));     // [5, 4, 3, 2, 1]
console.log(sortArray(alphabets, true));    // ['a', 'b', 'c', 'd', 'e']
console.log(sortArray(alphabets, false));   // ['e', 'd', 'c', 'b', 'a']

結論

array.sort((a, b) => {
  if (a > b) {
    return direction * 1;   // 戻り値を逆にすると降順にソート
  }
  return direction * -1;
});

Tips

文字列の配列の場合、 引数なしのsort() で昇順にソートできる
sort() 後に reverse() で降順にソートすることも可能

参考

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse

終わりに

随時更新します。

Discussion