マッピングとセット


📢 22/03/13復習
📚 Reference
https://ko.javascript.info/map-set
注意:これは個人がサイトで復習しやすいように再編成された文章です.
詳細については、リファレンスサイトにアクセスしてください.
地図
マッピング(Map)は、鍵付きデータを格納するため、オブジェクトと同様である.ただ.💥 異なる点は、マッピングがキー上で異なるデータ型を使用できることです.
概要図には、次の主な方法と基本情報が含まれています.new Map()マッピングを作成します.map.set(key, value) keyを使用してvalueを格納します.map.get(key)は、値keyを返します.keyが存在しない場合は、undefinedを返します.map.has(key) keyが存在する場合、trueを返し、存在しない場合、falseを返します.map.delete(key)keyを削除します.map.clear()概要図のすべての要素を削除します.map.size要素の数を返します.
let map = new Map();

map.set("1", "str1");   // 문자형 키
map.set(1, "num1");     // 숫자형 키
map.set(true, "bool1"); // 불린형 키

// 객체는 키를 문자형으로 변환한다는 걸 기억하고 계신가요?
// 맵은 키의 타입을 변환시키지 않고 그대로 유지합니다. 따라서 아래의 코드는 출력되는 값이 다릅니다.
alert( map.get(1)   ); // "num1"
alert( map.get("1") ); // "str1"

alert( map.size ); // 3
💥 オブジェクトとは異なり、マッピングではキーは文字に変換されません.鍵にはデータ制限はありません.
🔥 map[key]Mapを使用する正しい方法ではありません.
値がmap[key] = 2に設定されているように、map[key]を使用できます.ただし、この方法は、mapを通常のオブジェクトと見なします.だから制限がたくさんありますmapを使用する場合は、専用の方法mapset等を使用しなければならない.
🔥 [マッピング](Mapping)キーを使用してオブジェクトを許可します.
let john = { name: "John" };

// 고객의 가게 방문 횟수를 세본다고 가정해 봅시다.
let visitsCountMap = new Map();

// john을 맵의 키로 사용하겠습니다.
visitsCountMap.set(john, 123);

alert( visitsCountMap.get(john) ); // 123
💥 オブジェクトをキーとして使用できることは、マッピングの最も重要な機能の1つです.文字列キーはオブジェクトに使用できます.ただし、オブジェクトキーは使用できません.
オブジェクト上でオブジェクトキーを使用します.
let john = { name: "John" };

let visitsCountObj = {}; // 객체를 하나 만듭니다.

visitsCountObj[john] = 123; // 객체(john)를 키로 해서 객체에 값(123)을 저장해봅시다.

// 원하는 값(123)을 얻으려면 아래와 같이 키가 들어갈 자리에 `object Object`를 써줘야합니다.
alert( visitsCountObj["[object Object]"] ); // 123
getはオブジェクトであるため、すべてのキーが文字に変換されます.この過程で、visitsCountObjは文字形式に変換され、johnとなる.
🔥 マップキーの比較方法
マッピングは、"[object Object]"と呼ばれるアルゴリズムを使用して、値が等しいかどうかを決定する.このアルゴリズムは、一致演算子SameValueZeroと非常に似ていますが、同じ===およびNaNを処理する場合、一致演算子とは異なります.したがって、地図上ではNaN度キーを使用することができる.
このアルゴリズムは変更またはカスタマイズできません.
🔥 チェニンNaNが呼び出されるたびに、マッピング自体が返されます.これにより、map.setを「リンク」できます.
map.set("1", "str1")
  .set(1, "num1")
  .set(true, "bool1");
マッピング内の要素の操作を繰り返す
マッピング内の各要素について、次の3つの方法で繰り返し操作できます.map.set繰り返し可能(iterable、かわいい)オブジェクトを返します.各要素にキーがあります.map.keys()各要素の値を収集する小さなかわいいオブジェクトを返します.map.values()要素map.entries()をペアとする一対の小さなかわいいオブジェクトを返します.この拡張可能なオブジェクトは、[키, 값]反復文の基礎として使用されます.
let recipeMap = new Map([
  ["cucumber", 500],
  ["tomatoes", 350],
  ["onion",    50]
]);

// 키(vegetable)를 대상으로 순회합니다.
for (let vegetable of recipeMap.keys()) {
  alert(vegetable); // cucumber, tomatoes, onion
}

// 값(amount)을 대상으로 순회합니다.
for (let amount of recipeMap.values()) {
  alert(amount); // 500, 350, 50
}

// [키, 값] 쌍을 대상으로 순회합니다.
for (let entry of recipeMap) { // recipeMap.entries()와 동일합니다.
  alert(entry); // cucumber,500 ...
}
🔥 マッピングは挿入順序を覚えます.
マッピングは、値を挿入する順序でソートされます.これは、オブジェクトがPropertyを覚えていない順序とは異なります.
さらに、マップは、タイリングと同様の埋め込み方法for..ofもサポートする.
// 각 (키, 값) 쌍을 대상으로 함수를 실행
recipeMap.forEach( (value, key, map) => {
  alert(`${key}: ${value}`); // cucumber: 500 ...
});
Object.entries:オブジェクトをマッピングに置き換える
各要素がキー値ペアの配列であるか、初期化に使用できる小さなオブジェクトをマッピングに渡すことで、新しいマッピングを作成できます.
// 각 요소가 [키, 값] 쌍인 배열
let map = new Map([
  ["1",  "str1"],
  [1,    "num1"],
  [true, "bool1"]
]);

alert( map.get("1") ); // str1
通常のオブジェクトを使用してマッピングを作成する場合は、組み込みメソッドforEachを使用する必要があります.このメソッドは、オブジェクトのキー値ペアが要素(Object.entries(obj))である配列を返します.
let obj = {
  name: "John",
  age: 30
};

let map = new Map(Object.entries(obj));

alert( map.get("name") ); // John
[key, value]を使用してオブジェクトObject.entriesをタイルobjに変換し、このタイルを使用して新しいマップを作成しようとします.
Object.fromEntryys:マッピングをオブジェクトに置き換える[ ["name","John"], ["age", 30] ]を使用して一般オブジェクトを概略図に変換する方法について説明した.
次に、この反対のマッピングをオブジェクトに置き換える方法を見てみましょう.Object.entries(obj)を使用できます.この方法では、各要素がObject.fromEntries対の配列をオブジェクトに置き換えます.
let prices = Object.fromEntries([
  ["banana", 1],
  ["orange", 2],
  ["meat", 4]
]);

// now prices = { banana: 1, orange: 2, meat: 4 }

alert(prices.orange); // 2
[키, 값]を使用して地図をオブジェクトに変換します.
マッピングには、サードパーティ製コードからオブジェクトとしてデータを受信する場合に使用できるデータが格納されます.
let map = new Map();
map.set("banana", 1);
map.set("orange", 2);
map.set("meat", 4);

let obj = Object.fromEntries(map.entries()); // 맵을 일반 객체로 변환 (*)

// 맵이 객체가 되었습니다!
// obj = { banana: 1, orange: 2, meat: 4 }

alert(obj.orange); // 2
呼び出しObject.fromEntriesは、マッピングされたmap.entries()を要素とする小さな可愛さを返す.[키, 값]の適切な形態を使用するために.
また、表示される行をObject.fromEntriesに短縮することもできます.
let obj = Object.fromEntries(map); // .entries()를 생략함
(*)は、壊れやすいオブジェクトを受信するので、短縮されたコードは、以前のコードの動作と同じである.必ずしも案を伝える必要はない.一方、Object.fromEntriesにおける通常の繰り返し返されるキー値の対は、mapを用いた場合と同じである.したがって、map.entries()と同じキー値を持つ通常のオブジェクトが得られます.
三.
三(map)💥 値を繰り返す特殊な集合は許可されません.鍵を持たない値がグループに格納されます.
主な方法は次のとおりです.Set3つ作成します.転送可能な小さなオブジェクト(通常は配列)が受信されると、その値がコピーされ、配列に格納されます.new Set(iterable)値を追加し、セット自体を返します.set.add(value)値を削除します.呼び出しポイントリソースに値があるため削除に成功した場合は、set.delete(value)またはtrueを返します.false値がグループ内にある場合は、set.has(value)またはtrueを返します.false3つ空ける.set.clear()グループに何個の値があるかを数えます.
3つの内に同じ値(set.size)がある場合、valueが何度呼び出されても反応しません.これが3つの値が重複していない理由です.
アクセス者アクセスレコードを作成すると仮定します.1人のアクセス者が複数回アクセスしても、アクセス者を繰り返し記録しないことにします.つまり、1人の訪問者は「1回だけ記録」しなければならない.
正しいデータ構造は3つです.
let set = new Set();

let john = { name: "John" };
let pete = { name: "Pete" };
let mary = { name: "Mary" };

// 어떤 고객(john, mary)은 여러 번 방문할 수 있습니다.
set.add(john);
set.add(pete);
set.add(mary);
set.add(john);
set.add(mary);

// 셋에는 유일무이한 값만 저장됩니다.
alert( set.size ); // 3

for (let user of set) {
  alert(user.name); // // John, Pete, Mary 순으로 출력됩니다.
}
配列ではなく配列を使用してアクセス者情報を格納した後、配列メソッドset.add(value)を使用して重複値があるかどうかを確認することもできます.しかし、arr.findは、アレイ全体にわたって重複値を検索するため、3つのアレイに比べて性能が劣る.一方、3つは、値の一意性を決定するために最適化される.
グループ内の値の操作を繰り返す
3つの値は、arr.findまたはfor..ofを使用して反復することができる.
let set = new Set(["oranges", "apples", "bananas"]);

for (let value of set) alert(value);

// forEach를 사용해도 동일하게 동작합니다.
set.forEach((value, valueAgain, set) => {
  alert(value);
});
面白いところが目立つ.forEachに使用されるコールバック関数は、3つのパラメータを受信し、1つ目は値であり、2つ目も同じ値:forEachである.3つ目はターゲットオブジェクト(3つ)です.同じ値が引数に2回表示されます.
これは,マッピングとの互換性のためである.地図上のvalueAgainに書かれたコールバックを3つの買収を得るために.変に見えますが、このように実現されているので、地図を3つか3つに置き換えやすいです.
グループには、マッピングと同じ繰り返し操作方法もあります.forEachコレクション内のすべての値を含む小さなオブジェクトを返します.set.keys() set.values()と同じです.マッピングと互換性を持つ方法.set.keysセット内の各値を使用して作成されたset.entries()配列を含む小さなオブジェクトを返します.マップとの互換性を作成します.