11 Collection - iruma-tea/dokushujs GitHub Wiki

11. コレクション

コレクション ずは、倀のたずたりで管理するオブゞェクトの事です。
JavaScriptで䜿えるコレクションは、ES5たではObjectずArrayのみでしたが、
ES6からMap,Set,WeakMap,WeakSetが䜿えるようになった。

11.1 配列(Array)

配列の堎合は、倀のみを栌玍 する。栌玍された倀はそれぞれ、倀に察応した
添え字(むンデックス) が0から順に振られる。

11.1.1 配列の初期化

配列は、リテラル衚蚘たたは、Arrayを䜿っお初期化できる。

◆配列の初期化(リテラル衚蚘)

配列リテラル([])を蚘述するこずで、配列を初期化できる。

[構文] リテラルを䜿った配列の初期化

const 配列 = [倀1, 倀2, 倀3, ....];

(※) []は、配列のリテラルを定矩するための蚘号です。省略可胜を衚す[]ではないので泚意。

リテラルで配列を初期化する䟋

const fruits = ["banana", "orange", "grape"];
console.log(fruits);

◆配列の初期化(new Array)

new Arrayを蚘述しお配列を初期化する。

[構文] Arrayを䜿甚した配列の初期化
・匕数が1぀の堎合
const 配列 = new Array(配列の長さ);

・匕数が2぀以䞊の堎合
const 配列 = new Array(倀1, 倀2,....);
new Arrayで配列を初期化する䟋

const emptyArray = new Array(3);
console.log(emptyArray);

const filledArray = new Array(1, 2, 3);
console.log(filledArray);

11.1.2 配列の基本操䜜

初期化した配列の操䜜方法に぀いお、生成した配列の特定の倀を取埗・倉曎したい堎合は、添字を䜿う。

配列の芁玠の取埗・倉曎の䟋

const fruits = ["banana", "orange", "grape"];
console.log(fruits[0]);
> banana

fruits[1] = "apple";
console.log(fruits);
> ["banana", "apple", "grape"];

配列の芁玠は、0番目から始める点に泚意しおください。
たた、配列の長さ(個数)は、lengthプロパティから取埗できる。

11.1.3 配列のメ゜ッド

配列には、様々なメ゜ッドが甚意されおいる。メ゜ッドを䜿うこずで、宣蚀した埌ででも、倀の取埗・倉曎・削陀などを行うこずができる。

◆ 配列に芁玠を远加

push - 末尟に远加
pushメ゜ッドは、配列の末尟に芁玠を远加したす。

[構文] pushの蚘法
配列.push(远加したい芁玠1,[远加したい芁玠2,....])

const fruits = ["banana", "orange", "grape"];
fruits.push("apple");
consol.log(fruits);
> ["banana", "orange", "grape", "apple"]

unshit - 先頭に远加
unshitメ゜ッドは、配列の先頭に芁玠を远加する

[構文] unshiftの蚘法
配列.unshift(远加したい芁玠1,[远加したい芁玠2,....])

const fruits = ["banana", "orange", "grape"];

fruits.unshift("lemon");
console.log(fruits);

> ["lemon", "banana", "orange", "grape"];

◆ 配列から芁玠を削陀

配列から芁玠を削陀するずきに䜿うメ゜ッドです。

shift - 先頭を削陀 shiftメ゜ッドは、配列の先頭の芁玠を削陀する

[構文] shiftの蚘法
let 削陀した芁玠 = 配列.shift();

(䜿甚䟋)
const fruits = ["banana", "orange", "grape"];
let returnVal = fruits.shift();
console.log(fruits);
> ["orange", "banana"]
console.log(returnVal);
> "banana"

pop - 末尟を削陀 popメ゜ッドは、配列の末尟の芁玠を削陀したす。

[構文]popの蚘法
let 削陀した芁玠 = 配列.pop();

(䜿甚䟋)
const fruits = ["banana", "orange", "grape"];
let returnVal = fruits.pop();
> ["banana", "orange"]

console.log(returnVal);
> "grape"

splice - 芁玠の切り取り spliceメ゜ッドは、開始䜍眮から特定の長さ分の芁玠を切り取りする。

[構文] spliceの蚘法
let 切り取られた配列 = 元の配列.splice(開始䜍眮, 長さ[,芁玠远加1,芁玠远加2,....]);

(芁玠の切り取りの䟋)
const fruits = ["banana", "orange", "grape"];
let deletedVal = fruits.splice(1, 2);
console.log(fruits)
> ["banana"]

console.log(deletedVal);
> ["orange", "grape"]

(芁玠の切り取った箇所に芁玠を远加)
const fruits = ["banana", "orange", "grape"];
fruits.splice(1, 1, "apple", "lemon");

◆配列の結合・耇補

配列の結合や耇補(コピヌ)を行う堎合には、concatメ゜ッドを䜿う。たた、特定の芁玠を耇補したい堎合にはsliceメ゜ッド䜿う。

concat - 配列の結合 以䞋のように、concatメ゜ッドを䜿うず、別の配列を結合した新しい配列を䜜成する

[構文]concatの蚘法(配列の結合)
let 結合された配列 = 配列1.concat(配列2);

(䜿甚䟋)
const fruits = ["banana", "orange", "grape"];
const newFruits = fruits.concat(["melon", "mango"]);
console.log(newFruits);
> ["banana", "orange", "grape", "melon", "mango"]

console.log(frutis);
> ["banana", "orange", "grape"]
[構文]concatの蚘法(配列の耇補)
let 配列を耇補した配列 = 配列.concat();

const fruits = ["banana", "orange", "grape"];
const newFruits = fruits.concat();
consle.log(newFruits);

> ["banana", "orange", "grape"]

slice - 特定の芁玠を抜出した新しい配列を䜜成 sliceメ゜ッドは、開始䜍眮から終了䜍眮の盎前の芁玠たでを抜出した新しい配列を返す。
spliceず違い、元の配列に察しおは圱響を及がしたせん。

[構文]sliceの蚘法
let 切り取られた配列 = 元の配列.slice([開始䜍眮,終了䜍眮]);
const fruits = ["banana", "orange", "grape"];
const newFruits = fruits.slice(1, 2);
console.log(newFruits);
> ["orange"]

console.log(fruits);
> ["banana", "orange", "grape"]

const toEndFruits = frutis.slice(1);
console.log(toEndFruits);
> ["orange", "grape"]

const allFruits = fruits.slice();
console.log(allFruits);
> ["banana", "orange", "grape"]

◆ 配列内の芁玠の存圚チェック

indexOf - 最初に䞀臎した添え字を返す。
indexOf メ゜ッドは、配列内で最初に䞀臎した芁玠の添え字を返す。

[構文] indexOfの蚘法
let 䞀臎した添え字 = 配列.indexOf(存圚確認したい倀);

const fruits = ["banana", "orange", "grape"];
const found = fruits.indexOf("grape");
console.log(found);
> 2

const notFound = fruits.indexOf("watermelon");
console.log(notFound);
> -1

includes - 倀が存圚するか確認
includes メ゜ッドは、配列内の芁玠に倀が存圚するかを確認する。

[構文] includesの蚘法
let 真停倀 = 配列.includes(存圚確認したい倀);

const fruits = ["banana", "orange", "grape"];
const found = fruits.includes("grape");
console.log(found);
> true

const notFound = fruits.includes("lemon");
> false

◆その他のメ゜ッド

join - 芁玠を結合した文字列を䜜成
join メ゜ッドは、配列の芁玠を結合しお文字列を䜜成する。

[構文] joinの蚘法
let 結合された文字列 = 配列.join([区切り文字]);

区切り文字: 芁玠を結合する際の区切り文字を蚭定する。省略したずきはカンマ(,)で結合される。

(䜿甚䟋)
const arry = ["Hello", "World"];
console.log(array.join(" "));
> Hello World

fill - 芁玠を特定の倀で埋める
fill メ゜ッドは、配列の開始䜍眮、終了䜍眮で範囲指定した添え字の芁玠に察しお、
特定の倀を蚭定する。開始䜍眮、終了䜍眮を省略した堎合、すべおの芁玠を指定した倀で䞊曞きする。

[構文] fillの蚘法
配列.fill(各芁玠に蚭定したい倀[,開始䜍眮,終了䜍眮]);

(䜿甚䟋)
const arry = new Array(100);
arry.fill(0);
console.log(arry);
> [0,0,0,0,...]

falt - 倚次元配列の平坊化(次元を枛らす) flat メ゜ッドは、倚次元配列を匕数(平坊化レベル)で指定した次元分、配列の構造を平坊化する。
匕数を指定しないず堎合には、1次元分、平坊化する。倚次元配列ずは、配列構造が倚階局で圢成されおいる配列のこずです。
配列の次元を調敎するずきに䜿う。

[構文] flatの蚘法
let 平坊化された配列 = 倚次元配列.flat([平坊化レベル])

(䜿甚䟋)
const arry3D = [
    1, [2], 3,
    [4, [5]]
];

const arry2D = arry3D.flat();
console.log(array2D);
> [1, 2, 3, 4, [5]]

const arry1D = arry3D.flat(2);
console.log(arry1D);
> [1, 2, 3, 4, 5]

reverse - 芁玠の順番を逆に眮換
reverse メ゜ッドは、配列の芁玠の䞊びを逆にする

[構文] reverseの蚘法
配列.reverse();

(䜿甚䟋)
const arry = [1,2,3,4,5]
arry.reverse();
console.log(arry);

> [5, 4, 3, 2, 1]

11.1.4 コヌルバック関数を匕数に取るメ゜ッド

配列が保持するメ゜ッドには、コヌルバック関数を匕数に取るものがある。
コヌルバック関数を匕数に取るメ゜ッドは、配列の芁玠に察する繰り返し凊理の蚘述の簡略化や凊理の内容を明確する目的で䜿われる。

◆ forEach - 配列の各芁玠を䜿っお繰り返し凊理を行う

forEachメ゜ッドを䜿うこずで、配列の芁玠に察する繰り返し凊理をコヌルバック関数を利甚しお蚘述できる。

[構文] forEachの蚘法
配列.forEach(function(value, index, arry) {
    /* 配列の各芁玠を䜿った凊理 */
}[,_this]);

value: 配列の倀が1぀ず぀枡されおくる。
index: 配列の添え字が1぀ず぀枡されおくる。
arry: 配列自䜓が枡される。
_this: コヌルバック関数内のthisの参照先を蚭定する。

(䜿甚䟋)
const arry = [1, 2, 3, 4, 5];
arry.forEach(function(value, index, arry) {
    console.log(value, index, arry);
});
> 1 0 [1, 2, 3, 4, 5]
> 2 1 [1, 2, 3, 4, 5]
> 3 2 [1, 2, 3, 4, 5]
> 4 3 [1, 2, 3, 4, 5]
> 5 4 [1, 2, 3, 4, 5]

(䜿甚䟋 アロヌ関数)
const arry = [1, 2, 3, 4, 5];
arry.forEach((value, index, arry) => console.log(value, index, arry));
> 1 0 [1, 2, 3, 4, 5]
> 2 1 [1, 2, 3, 4, 5]
> 3 2 [1, 2, 3, 4, 5]
> 4 3 [1, 2, 3, 4, 5]
> 5 4 [1, 2, 3, 4, 5]

(䜿甚䟋 名前付き関数)
const arry = [1, 2, 3, 4, 5];
function multiply5(value) {
    console.log(value * 5);
}
arry.forEarch(multiply5);
> 5
> 10
> 15
> 20
> 25

◆ map - 新しい配列の䜜成

map メ゜ッドは、コヌルバック関数の戻り倀を芁玠に取る新しい配列を返す。

[構文] mapの蚘法
let 新しい配列 = 配列.map((value, index, arry) => {
    return 新しい配列に远加したい倀;
}, [,this]);

mapメ゜ッドの䜿い方は、forEachメ゜ッドず同じであるが、mapは戻り倀ずしお新しい配列を返す点がこずなる。

(䜿甚䟋) 元の配列の数倀に5を掛けた倀を保持する配列を䜜成
const arry = [1, 2, 3, 4, 5];
function multiply5(value) {
    return value * 5;
}

const newArry = arry.map(multiply5);
// const newArry = arry.map(value => value * 5); ず同じ意味
console.log(newArry);
> [5, 10, 15, 20, 25]

◆ filter - 特定の倀を陀いた新しい配列の䜜成

filterメ゜ッドは、コヌルバック関数の条件がtrueになったずきの配列の芁玠のみを保持する新しい配列を䜜成する。

[構文] filterの蚘法
let 新しい配列 = 配列.filter((value, index, arry) => {
    return 真停倀; // trueのずき、valueが新しい配列に远加される
},[_this]);

(䜿甚䟋)
const arry = [1, 2, 3, 4, 5];
function gt3(value) {
    return value > 3;
}

const newArry = arry.filter(gt3);
console.log(newArry);

> [4, 5]

◆ every - すべおの芁玠の倀が条件に䞀臎するか

everyメ゜ッドは、すべおの芁玠がコヌルバック関数で実装された条件でtrueずなるかどうかをテストする。
すべおの条件が䞀臎した堎合に結果がtrueずなり、それ以倖はfalseになる。

[構文]everyの蚘法
let 結果 = 配列.every((value, index, arry) => {
    return 真停倀;
},[_this]);

(䜿甚䟋)
const arry = [1, 2, 3, 4, 5];

const result = arry.every(value => value > 0);
console.log(result);
> true

const result2 = arry.every(value => value > 3);
console.log(result2);
> false

◆ some - すくなくずも1぀の倀が条件に䞀臎するか

someメ゜ッドは、少なくずも1぀の倀がコヌルバック関数で実装された条件でtrueずなるかどうかをテストする。
1぀も条件に䞀臎しない堎合には結果がfalseになり、それ以倖はtrueになる。

[構文] someの蚘法
let 結果 = 配列.some((value, index, arry) => {
    return 真停倀;
}[,_this]);

(䜿甚䟋)
const arry = [1, 2, 3, 4, 5];
const result1 = arry.some(value => value > 4);
console.log(result1);
> true

◆ find - 条件を満たした最初の芁玠の倀を取埗

findメ゜ッドは、コヌルバック関数の条件を満たした最初の倀を返す。

[構文] findの蚘法
let 条件を満たす最初の倀 = 配列.find((value, index, arry) => {
    return 真停倀;
},[_this]);

(䜿甚䟋)
const arry = [1, 2, 7, 8, 9];
const result = arry.find(value => value > 2);
console.log(result);
> 7

◆ sort - 配列の䞊び替え

sort メ゜ッドは、芁玠の䞊べ替えるこずができる。

[構文] sortの蚘法
・文字列ずしお昇順で芁玠を䞊べ替え
配列.sort();

・比范関数を䜿っお芁玠を䞊べ替え
配列.sort(比范関数);

(䜿甚䟋-昇順にする堎合)
const strArry = ["b", "c", "a"];
strArry.sort();
console.log(strArry);
> ["a", "b", "c"]

(䜿甚䟋-比范関数を䜿った䞊べ替え)
function compare(val1, val2) {
    if (val1 < val2) {
        return -1; // 戻り倀が0より小さい堎合、val1をval2の前に配眮
    }
    if (val1 > val2) {
        return 1; // 戻り倀が0より倧きい堎合、val2をval1の前に配眮
    }
    return 0; // 戻り倀が0の堎合、val1, val2の順番をそのたた維持
}

const arry = [10, 2, 7, 3, 9];
arry.sort(compare);
console.log(arry);
> [2, 3, 7, 9, 10]

比范関数の戻り倀ず䞊び順

戻り倀 䞊び順
負の時 val1 val2
正の時 val2 val1
0の時 䞊び順は倉曎なし

◆ reduce - 配列から単䞀の出力倀を生成

reduceメ゜ッドは、配列のルヌプしお各芁玠の倀から単䞀の出力倀を生成したす。

[構文] reduceの蚘法
let result = 配列.reduce((totalValue, currentValue, index, arry) => {
    return nextTotalValue;
},[,initValue])

totalValue: 前のルヌプの戻り倀(nextTotalValue)が枡される。初回ルヌプのずきにはinitValueの倀(initValueが蚭定されおいた堎合)、たたは配列の
1぀め目の芁玠が枡される。
currentValue: 配列の芁玠が1぀ず぀枡されおくる。初回ルヌプのずきは配列の1぀目の芁玠の倀(initValueが蚭定されおいた堎合)、たたは配列の2぀目の芁玠の倀が枡される。
index: 配列の添え字が1぀ず぀枡される。
arry: 配列自䜓が枡される。
nextTotalValue: 次のルヌプのtotalValueに蚭定したい倀を蚭定する。たた、最埌のルヌプの戻り倀がreduceメ゜ッドの結果(result)ずなる。
result: 最埌のルヌプの倀ずなる。
initValue: 蚭定された堎合、1ルヌプ目のtotalValueに枡される。


(䜿甚䟋)
function reducer(totalValue, currentValue) {
    return totalValue + currentValue;
}

const arry = [1, 2, 3, 4, 5];
const result = arry.reduce(reducer);
console.log(result);
> 15;

11.1.5 静的メ゜ッド

Arrayコンストラクタにも、静的メ゜ッドがあらかじめ甚意されおいる。

◆ from - 配列颚オブゞェクトや反埩可胜オブゞェクトを配列に倉換

from メ゜ッドを䜿甚するず、Setなどの反埩オブゞェクトやargumentsなどの配列颚(array-like)オブゞェクトから配列を䜜成できる。

・Setから配列を䜜成
const set = new Set();
set.add(1);
set.add(2);
set.add(3);

const convertedArray = Array.from(set);
console.log(convertedArray);
> [1, 2, 3]

◆ isArray - 配列かどうか刀定

配列かどうかを調べるには、isArray メ゜ッドを䜿う。

const set = new Set();
console.log(Array.isArray(set));
> false

const converedArray = Array.from(set);
console.log(Array.isArray(converedArray));
> true

11.1.6 分割代入

分割代入 ずは 配列やオブゞェクトの芁玠を盎接、倉数ずしお取り出しお䜿甚する蚘法です。

◆ 配列の分割代入

配列の分割代入では、右オペランドの配列の芁玠が巊オペランドの倉数(倉数A,倉数B)にそれぞれ、代入される。
巊蟺の倉数は、通垞の倉数宣蚀を行った倉数ず同じように䜿うこずができる。

[構文] 分割代入の蚘法(配列)
let [倉数A, 倉数B = 初期倀B] = 配列;

(䜿甚䟋)
let arry = [1, 2, 3];
let [x,y,z] = arry;
console.log(x, y, z);
> 1 2 3

let [x1, z1] = arry;
console.log(x1, z1);
> 1, 3

let x2;
[x2] = arry;
console.log(x2);
> 1

let [,,,a3 = 4] = arry;
console.log(a3);
> 4

let [x4, ...rest] = arry;
console.log(x4, rest);
> 1 [2, 3]

◆ オブゞェクトの分割代入

オブゞェクトの分割代入ではプロパティ名ず倉数名を䞀臎させる 必芁がある。

[構文] 分割代入の蚘法(オブゞェクト)
let {プロパティ名A, プロパティ名B = 初期倀B} = オブゞェクト;

(䟋)
let {banana, orange, apple} = { apple: "リンゎ", banana: "バナナ", orange: "オレンゞ"};
console.log(banana);
> バナナ

let {banana: b, apple: a} = {apple: "リンゎ", banana: "バナナ"};
console.log(b, a);
> バナナ リンゎ

let {banana: b2="おいしいバナナ"} = {apple: "リンゎ"};
console.log(b2);
> おいしいバナナ

let {banana: b3, ...fruits} = {apple: "リンゎ", banana: "バナナ", orange: "オレンゞ"};
console.log(fruits);
> {apple: "リンゎ", orange: "オレンゞ"}

let { fruits: {apple: a3}} = { fruits: {apple: "リンゎ", banana: "バナナ"}};
console.log(a3);
> リンゎ

let prop = "apple";
let {[prop]: a4} = {apple: "リンゎ", banana: "バナナ", orange: "オレンゞ"};
console.log(a4);
> リンゎ

◆ 関数の匕数に察する分割代入

分割代入は、関数の匕数を受け取るずきにも䜿甚可胜。関数の匕数に分割代入を䜿うず、枡されたオブゞェクトや配列から 特定の芁玠を抜出し、匕数に枡すこずができる。

const fruitsArry = ["banana", "orange", "grape"];
const fruitsObj = {banana: "バナナ", orange: "オレンゞ"};

function bunkatuArry([,,fruit3]) { // 䞉぀目の芁玠のみ関数内で䜿甚する
    console.log(fruit3);
}

bunkatuArry(fruitsArry);
> grape

function bunkatuObj({orange}) { // orangeのみ匕数ずしお抜出
    console.log(orange);
}

bunkatuObj(fruitsObj);
> オレンゞ

11.2 Set

ES6で远加されたSetは、䞀意の倀を栌玍するコレクション。Setには、重耇した倀を保持するこずができない。

11.2.1 Setの初期化

Setは次のように初期化できる。

[構文] Setの初期化
・空のSetオブゞェクトを䜜成する堎合
const Setオブゞェクト = new Set();

・反埩可胜オブゞェクトからSetオブゞェクトを䜜成する堎合
const Setオブゞェクト = new Set(反埩可胜オブゞェクト);

(䟋) 配列からSetオブゞェクトを䜜成
const convertedSet = new Set([1, 2, 3]);
console.log(convertedSet);
> Set {1, 2, 3}

11.2.2 Setのメ゜ッド

Setには次のようなメ゜ッドがある。

◆ add - 倀の远加

add メ゜ッドを䜿うず、Setオブゞェクトに察しお、倀を远加するこずができる。
プリミティブ倀、オブゞェクトに関わらず、どのような倀でも远加可胜。

const fruits = new Set();
fruits.add("apple");
fruits.add("orange");
fruits.add("orange"); // 重耇した倀を远加
console.log(fruits);
> Set {"apple", "orange"}

◆ delete - コレクション内の倀を削陀

delete メ゜ッドを䜿甚するず、Setオブゞェクト内から倀を削陀できる

const fruits = new Set(["apple", "orange"]);
fruits.delete("orange");
console.log(fruits);
> Set {"apple"}

◆ clear - コレクション内の倀をすべお削陀

clear メ゜ッドは、Setオブゞェクトが保持する倀をすべお削陀する。

const fruits = new Set(["apple", "orange"]);
fruits.clear();
console.log(fruits);
> Set { }

◆ has - コレクション内に倀が存圚するか確認

has メ゜ッドは、Setオブゞェクト内に䞀臎する倀が存圚するかを確認する。

const fruits = new Set(["apple", "orange"]);
console.log(fruits.has("orange"));
> true
console.log(fruits.has("banana"));
> false

11.2.3 コヌルバック関数を匕数に取るメ゜ッド

コヌルバック関数を匕数に取るSetのメ゜ッドは、forEachです。

◆ forEach - コレクションの芁玠をルヌプ凊理

SetオブゞェクトのforEach メ゜ッドは、配列のforEachメ゜ッドず同様にコヌルバック関数を䜿っお、
ルヌプ凊理を行う。

[構文] forEachの蚘法
Set オブゞェクト.forEach(function(value, sameValue, set) {
    /* Setの各芁玠を䜿った凊理 */
}, [_this])

value: Setの倀が1぀ず぀枡される。
sameValue: valueず同じ倀が枡される。
set: Setオブゞェクト自䜓が枡される。
_this: コヌルバック関数内のthisの参照先を蚭定する。

Setの堎合、コヌルバック関数の第䞀匕数valueず第二匕数sameValueは、それぞれ同じ倀が枡される。

const set = new Set(["倀1", "倀2"]);
set.forEach((value, sameValue, set) => {
    console.log(`value: [${value}],sameValue: [${sameValue}],set: `, set);
});
> value: [倀1],sameValue: [倀1],set:  Set(2) {'倀1', '倀2'}
> value: [倀2],sameValue: [倀2],set:  Set(2) {'倀1', '倀2'}

11.2.4 Setのプロパティ

◆ size - コレクションの長さを取埗

配列の堎合はlengthプロパティから配列の長さ(芁玠数)を取埗したしたが、Setの堎合はsizeプロパティに長さが栌玍されおいたす。

const fruits = new Set(["apple", "orange"]);
console.log(fruits.size);
> 2

11.3 Map

ES6で远加されたMapは、キヌず倀を察で保持するコレクションです。
ES5たでは、オブゞェクト{}を䜿っお、キヌず倀を察で管理しおいた。ES6以降ではMapを䜿うこずで管理できる。

11.3.1 Mapの初期化

Mapは次のように初期化できる。

const emptyMap = new Map();
console.log(emptyMap);
> Map { }

const convertedMap = new Map([
    ["キヌ1", "倀1"],
    ["キヌ2", "倀2"]
]);
console.log(convertedMap);
> Map { "キヌ1": "倀1", "キヌ2": "倀2" }

11.3.2 Mapのメ゜ッド

Mapには次のようなメ゜ッドがある。

◆ set - 倀の蚭定

setメ゜ッドを䜿うず、Mapオブゞェクトに察しお倀を远加できる。
Mapオブゞェクトのキヌには、文字列以倖にも数倀、真停倀、オブゞェクトなど、すべおの型の倀を䜿うこずができる。

const fruits = new Map();
fruits.set(1, "apple");
const emptyObj = { };
fruits.set(emptyObj, "orange");
fruits.set(true, "grap");
console.log(fruits);
> Map {1 => "apple", emptyObj => "orange", true => "grape"}

◆ get - 倀の取埗

get メ゜ッドで倀を取埗する

const fruits = new Map();
const emptyObj = { };
fruits.set(emptyObj, "orange");
console.log(fruits.get(emptyObj));
> orange

・異なるオブゞェクトで倀を取埗した堎合
const fruits = new Map();
const emptyObj = { };
fruits.set(emptyObj, "orange");
console.log(fruits.get({})); // emptyObjず構造が同じ別のオブゞェクトで倀を取埗
> undefined // 倀は取埗できない

◆ delete - コレクション内の倀を削陀

delete メ゜ッドを䜿うず、Mapオブゞェクト内から倀を削陀できる。

const fruits = new Map([
    [1, "apple"],
    [false, "orange"],
]); 

fruits.delete(false);
console.log(fruits);
> Map { 1 => "apple" }

◆ clear - コレクション内の倀をすべお削陀

clear メ゜ッドは、Mapオブゞェクト内に保存したキヌず倀のペアをすべお削陀する

const fruits = new Map([
    [1, "apple"],
    [false, "orange"],
]);

fruits.clear();
console.log(fruits);
> Map { }

◆ has - コレクション内に倀が存圚するか確認

has メ゜ッドは、Mapオブゞェクト内にキヌが存圚するかを確認する

const fruits = new Map([
    [1, "apple"],
    [false, "orange"],
]);

console.log(fruits.has(false));
> true
console.log(fruits.has(2));
> false

11.3.3 コヌルバック関数を匕数に取るメ゜ッド

コヌルバック関数を匕数に取るMapのメ゜ッドもforEach。

◆ forEach - Mapオブゞェクトの芁玠をルヌプ凊理

MapのforEach メ゜ッドは、配列のforEachず同様に、コヌルバック関数を䜿っおルヌプ凊理を行う。

Mapオブゞェクト.forEach(function(value, key, map) {
    /* Mapの各芁玠を䜿った凊理 */
}[,_this]);

value: Mapの倀が1぀ず぀枡される。
key: Mapのキヌが1぀ず぀枡される。
map: Mapオブゞェクト自䜓が枡される。
_this: コヌルバック関数内のthisの参照先を蚭定する。

(䜿甚䟋)
const map = new Map([
    ["キヌ1", "倀1"],
    ["キヌ2", "倀2"],
]);

map.forEach((value, key, map) => {
    console.log(`value: [${value}], key: [${key}], map: `, map);
});

> value: [倀1], key: [キヌ1], map:  Map(2) {'キヌ1' => '倀1', 'キヌ2' => '倀2'}
> value: [倀2], key: [キヌ2], map:  Map(2) {'キヌ1' => '倀1', 'キヌ2' => '倀2'}

11.3.4 Mapのプロパティ

◆ size - コレクションの長さを取埗

Mapオブゞェクトでは、Setず同様、sizeプロパティにMapの長さの情報を保持しおいる。

const fruits = new Map();
fruits.set(1, "apple");
const emptyObj = { };
fruits.set(emptyObj, "orange");
console.log(fruits.size);
> 2

11.3.5 Mapからオブゞェクトぞの倉換

Mapからオブゞェクト{ }に倉換するには、次のように蚘述する。

[構文] Mapからオブゞェクトぞ倉換
const オブゞェクト = Object.fromEntries(Mapオブゞェクト);

(䜿甚䟋)
const map = new Map([
    ["キヌ1", "倀1"],
    ["キヌ2", "倀2"],
]);

const obj = Object.fromEntries(map);
console.log(obj["キヌ1"]);
> 倀1

◆ Mapずオブゞェクトの䞻な違い

  • Mapの堎合、キヌに文字列以倖も䜿甚可胜
  • Mapの堎合、for...of文を䜿った繰り返し凊理を蚘述可胜
  • Mapの堎合、sizeを通しお長さを取埗可胜
  • Mapの堎合、メ゜ッドを保持できない

11.4 WeakMap

WeakMap は、キヌにオブゞェクトのみ䜿甚可胜なコレクションです。

11.4.1 WeakMapの初期化

WeakMapは次のようにしお初期化する

const wm = new WeakMap();

11.4.2 WeakMapのメ゜ッド

WeakMapには次のようなメ゜ッドがある。

◆ set - 倀の蚭定

set メ゜ッドで、WeakMapオブゞェクトに察しおキヌず倀を登録する。

const wm = new WeakMap();
let keyObj = { };
wm.set(keyObj, "value");
console.log(wm);
> WeakMap {{
} => 'value'}
wm.set(1, "value2"); // オブゞェクト以倖をキヌにするず゚ラヌが発生する。 
> VM120:1 Uncaught TypeError: Invalid value used as weak map key
>    at WeakMap.set (<anonymous>)
>    at <anonymous>:1:4

◆ get - 倀を取埗

get メ゜ッドは、特定のキヌに察応する倀を取埗する

const wm = new WeakMap();
let keyObj = {};
wm.set(keyObj, "value");
console.log(wm.get(keyObj));
> value

◆ delete - コレクション内の倀を削陀

delete メ゜ッドは、特定のキヌの倀を削陀する

const wm = new WeakMap();
let keyObj = { };
wm.set(keyObj, "value");
wm.delete(keyObj);
console.log(wm);
> WeakMap { }

◆ has - コレクション内に倀が存圚するか確認

has メ゜ッドは、WeakMap内に䞀臎するキヌオブゞェクトが存圚すればtrueを返す。

const wm = new WeakMap();
let keyObj = { };
wm.set(keyObj, "value");
console.log(wm.has(keyObj));
> true
console.log(wm.has({}));
> false

WeakMapは反埩可胜なオブゞェクトではないため、for...of文などを䜿った反埩凊理はできない。

⚠ **GitHub.com Fallback** ⚠