【JS】【TS】配列・リスト操作

■ はじめに

https://dk521123.hatenablog.com/entry/2021/01/03/000000

でループを取り上げたが、
今回は、配列(Array)・リストを取り上げる。

目次

【0】定義方法
【1】push ... リストへ追加
【2】concat ... リストの結合
【3】slice ... リストの部分抽出
【4】sort ... リストのソート
【5】find / filter ... 合致したものを返却する
 1)差異
【6】some / every ... 合致しているかどうかbool値で返却
 1)差異
【7】join ... リストを結合し、文字列返却(e.g. カンマ区切り)
【Z】配列・リストあれこれ
 1)辞書・クラスの一覧をリストに変換するには
 2)辞書・クラスの一覧から該当のデータを取得するには

【0】定義方法

* 色々な方法がある

https://algorithm.joho.info/typescript/array-push-ts/
https://maku.blog/p/ttwoetd/

サンプル

// 配列の宣言
var sampleList1: string[] = [];
var sampleList2: Array<string> = [];
var sampleList3: any[] = new Array(3);

【1】push ... リストへ追加

* 配列の末尾に追加

【2】concat ... リストの結合

* 2つ以上の配列を結合する

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/concat
後書き: スプレッド構文 / Three-dots について

*  スプレッド構文 / Three-dots (...) で同じことができる
 => 詳細は、以下の関連記事を参照のこと

https://dk521123.hatenablog.com/entry/2021/03/09/000000

TypeScript・サンプル

const list1 = [1, 2, 3];
const list2 = [4, 5, 6];

const list3 = list1.concat(list2);

// [ 1, 2, 3 ] <= 元のリストには影響しない
console.log(list1);
// [ 4, 5, 6 ] <= 元のリストには影響しない
console.log(list2);
// [ 1, 2, 3, 4, 5, 6 ] <= リストを結合
console.log(list3);

【3】slice ... リストの部分抽出

* 配列の指定した部分を抽出して、生成する

使用上の注意

1)slice(start, end) で指定した場合、
  start から end まで指定したことになるが
  end は含まれないことに注意!
2)配列の一部の浅いコピーを新しい配列オブジェクトとして生成

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

【4】sort ... リストのソート

リストのソート処理。
 => 詳細は、以下の関連記事を参照のこと。

配列・リスト操作 ~ ソート編 ~
https://dk521123.hatenablog.com/entry/2021/02/19/000000

【5】find / filter ... 合致したものを返却する

* 合致したものを返却する
 => filter のサンプルは、下記「2)辞書・クラスの一覧から該当のデータを取得するには」を参照

1)差異

find

* 条件が一致していた場合、配列内の 最初の要素 の 値 (単一オブジェクト) を返す
 => 一致しなかった場合は、 undefined が返却

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

* 条件が一致していた場合、その配列内の 全て要素 (複数オブジェクト) を返す
 => 一致しなかった場合は、 空リストが返却

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

【6】some / every ... 合致しているかどうかbool値で返却

1)差異

some

* 対象配列が条件と1個でも一致していた場合、true を返す

every

* 対象配列が条件と全て致していた場合、true を返す

【7】join ... リストを結合し、文字列返却(e.g. カンマ区切り)

const list = [
  'data1',
  'data2',
  'data3',
]
const result0 = list.join(', ')

// result0 = data1, data2, data3
console.log(`result0 = ${result0}`)

【Z】配列・リストあれこれ

1)辞書・クラスの一覧をリストに変換するには

https://dk521123.hatenablog.com/entry/2021/01/03/000000

で扱った map を利用する。

TypeScript・サンプル

// Example to convert Dictionary to List
const people = [
  { id: "0001", name: "Mike" },
  { id: "0002", name: "Tom" },
  { id: "0003", name: "Sam" },
  { id: "0004", name: "Kevin" },
  { id: "0005", name: "Ken" },
];

const idList = people.map(person => person.id);

// [ '0001', '0002', '0003', '0004', '0005' ]
console.log(idList);

2)辞書・クラスの一覧から該当のデータを取得するには

https://dk521123.hatenablog.com/entry/2021/01/03/000000

で扱った filter を利用する。

【補足】
 filter で返ってくるのは、配列で返ってくる。
IDなどで絞って必ず1件しかない場合は、以下のサンプルのように
"[0]"にしてあげればいい。(条件が一致しなくても大丈夫そう)

TypeScript・サンプル

const people = [
  { id: "0001", name: "Mike" },
  { id: "0002", name: "Tom" },
  { id: "0003", name: "Sam" },
  { id: "0004", name: "Kevin" },
  { id: "0005", name: "Ken" },
];

let targetId = '0003';
let targetPerson = people.filter(function(person) {
  return person.id === targetId;
})[0];
// { id: '0003', name: 'Sam' }
console.log(targetPerson);

targetId = '0009';
targetPerson = people.filter(function(person) {
  return person.id === targetId;
})[0];
// undefined
console.log(targetPerson);

参考文献

https://www.wakuwakubank.com/posts/280-javascript-array-helper/

関連記事

TypeScript ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/12/21/180904
ループ操作 ~ map etc ~
https://dk521123.hatenablog.com/entry/2021/01/03/000000
配列・リスト操作 ~ ソート編 ~
https://dk521123.hatenablog.com/entry/2021/02/24/222452
配列・リスト操作 ~ スプレッド構文 / Three-dots ~
https://dk521123.hatenablog.com/entry/2021/03/09/000000