ホームページ  >  記事  >  ウェブフロントエンド  >  es6 マップのメンバーはユニークですか?

es6 マップのメンバーはユニークですか?

青灯夜游
青灯夜游オリジナル
2022-10-31 18:43:521677ブラウズ

es6 マップ メンバーは固有です。 ES6 の新しい Map データ構造はオブジェクトに似ています。キー値は文字列に限定されず、メンバー値は一意です。Map 構造は「値と値」の対応を提供し、より完全なハッシュ構造の実装です。マップ オブジェクトはキーと値のペアを格納し、キーの元の挿入順序を記憶します。任意の値 (オブジェクトまたはプリミティブ) をキーまたは値として使用できます。

es6 マップのメンバーはユニークですか?

このチュートリアルの動作環境: Windows 7 システム、ECMAScript バージョン 6、Dell G3 コンピューター。

Map と Set は両方とも ES6 の新しいデータ構造です

  • Map はオブジェクトに似ており、キー値は文字列に限定されず、メンバー値もユニークです。

  • Set は配列に似ており、一意のメンバー値を持ちます。

#Map の基本概念

ES6 は Map データ構造を提供します。オブジェクトと似ており、キーと値のペアの集合でもありますが、「キー」の範囲は文字列に限定されず、さまざまな種類の値(オブジェクトを含む)をキーとして使用できます。言い換えると、Object 構造は「文字列と値」の対応を提供し、Map 構造は「値と値」の対応を提供します。これは、ハッシュ構造のより完全な実装です。 「キーと値」のデータ構造が必要な場合は、オブジェクトよりもマップの方が適しています。

マップの機能

  • マップ オブジェクトはキーと値のペアを保存し、キーの元の挿入順序を記憶できます。

  • 任意の値 (オブジェクトまたはプリミティブ) をキーまたは値として使用できます。

  • Map は ES6 で導入された新しいデータ構造です。

    ES6 Map と Set を参照してください。

マップとオブジェクトの違い

  • オブジェクトのキーには文字列またはシンボルのみを使用できますが、マップ キーには任意の値を指定できます。

  • マップ内のキー値は順序付けされています (FIFO 原則) が、オブジェクトに追加されたキーは順序付けされていません。

    オブジェクトが順序付けされていないことに関する公式の説明: 1. オブジェクトは Object 型のメンバーであり、それぞれにプリミティブ値が含まれる順序付けされていないプロパティのコレクションです。 オブジェクト、または関数。オブジェクトのプロパティに格納される関数は、 メソッドと呼ばれます。 2. Chrome Opera の JavaScript 解析エンジンは、新しい ECMA-262 第 5 版仕様に準拠しています。したがって、for-in ステートメントを使用してオブジェクト プロパティを走査する場合、走査順序はプロパティ構築順序ではありません。 IE6 IE7 IE8 Firefox Safari 用の JavaScript 解析エンジンは古い ECMA-262 第 3 版の仕様に従っており、属性の走査順序は属性が構築される順序によって決まります。

  • Map のキーと値のペアの数は size 属性から取得できますが、Object のキーと値のペアの数は手動でのみ計算できます。

  • オブジェクトには独自のプロトタイプがあり、プロトタイプ チェーン上のキー名がオブジェクトに設定したキー名と競合する可能性があります。

マップ プロパティ

  • Map.prototype.size – キーと値のペアの数を返します。 Map オブジェクト。

マップ操作メソッド

  • Map.prototype.clear() – すべてのキー/値を削除します。オブジェクトを右にマップします。
  • Map.prototype.set() – キーと値のペアを設定し、Map オブジェクトを返します。
  • Map.prototype.get() – キーに対応する値を返します。キーが存在しない場合は、未定義を返します。
  • Map.prototype.has() – Map にキーに対応する値が含まれているかどうかを判断するために使用されるブール値を返します。
  • Map.prototype.delete() – マップ内の要素を削除します。削除が成功した場合は true を返し、失敗した場合は false を返します。

Map ループのメソッド

Map の走査順序が挿入順序になります。

  • Map.prototype.keys(): キー名のトラバーサを返します。
  • Map.prototype.values(): キー値のトラバーサを返します。
  • Map.prototype.entries(): すべてのメンバーのトラバーサを返します。
  • Map.prototype.forEach(): Map のすべてのメンバーを走査します。
#他のメソッド

    for of
  • iterableがあるのでこのメソッドも使えます
作成の開始

##マップ タイプと新しいキーワードを使用してマップを作成します。

#配列だけでなく、Iterator インターフェイスを持つものであれば何でも、各メンバーは2要素配列のデータ構造 そのため、Set Map 配列で Map

空のマップを作成し、

let map1 = new Map();
map1.set('123',123)
配列を追加して Map

const m2 = new Map([['baz', 3]]);
を作成できます。 set マップの作成

#
const set = new Set([
  ['foo', 1],
  ['bar', 2]
]);

const m3 = new Map(set);

#map 新しいマップの作成##Note m3 === m2 //false

const m3 = new Map(m2);

例: できること

オブジェクトとの最大の違い: 複数の種類のキー

字符串

var myMap = new Map(); 
var keyString = "a string"; 
myMap.set(keyString, "和键'a string'关联的值");

对象

var myMap = new Map(); 
var keyObj = {}
myMap.set(keyObj, "和键 keyObj 关联的值");

函数

var myMap = new Map(); 
var keyFunc = function () {} // 函数 
myMap.set(keyFunc, "和键 keyFunc 关联的值");

NaN

var myMap = new Map(); 
myMap.set(NaN, "not a number");

Map 遍历成员方法

keys() , values() , entries()Map 的遍历顺序就是插入顺序

const map = new Map([
  ['F', 'no'],
  ['T',  'yes'],
]);

for (let key of map.keys()) {
  console.log(key);
}
// "F"
// "T"

for (let value of map.values()) {
  console.log(value);
}
// "no"
// "yes"

for (let item of map.entries()) {
  console.log(item[0], item[1]);
}
// "F" "no"
// "T" "yes"

// 或者
for (let [key, value] of map.entries()) {
  console.log(key, value);
}
// "F" "no"
// "T" "yes"

// 等同于使用map.entries()
for (let [key, value] of map) {
  console.log(key, value);
}

使用扩展运算符可以快速转数组

const map = new Map([  [1, 'one'],
  [2, 'two'],
  [3, 'three'],
]);

[...map.keys()]
// [1, 2, 3]

[...map.values()]
// ['one', 'two', 'three']

[...map.entries()]
// [[1,'one'], [2, 'two'], [3, 'three']]

[...map]
// [[1,'one'], [2, 'two'], [3, 'three']]

转为数组后,可以使用数组的map,filter方法

const map0 = new Map()
  .set(1, 'a')
  .set(2, 'b')
  .set(3, 'c');

const map1 = new Map(
  [...map0].filter(([k, v]) => k < 3)
);
// 产生 Map 结构 {1 => &#39;a&#39;, 2 => &#39;b&#39;}

const map2 = new Map(
  [...map0].map(([k, v]) => [k * 2, &#39;_&#39; + v])
    );
// 产生 Map 结构 {2 => &#39;_a&#39;, 4 => &#39;_b&#39;, 6 => &#39;_c&#39;}

Map 增 删 查 清空

const m = new Map();
const o = {p: &#39;Hello World&#39;};

m.set(o, &#39;content&#39;)
m.get(o) // "content"

m.has(o) // true
m.delete(o) // true
m.has(o) // false
m.clear()

与其他数据结构的互相转换

(1)Map 转为数组

前面已经提过,Map 转为数组最方便的方法,就是使用扩展运算符(...)。

const myMap = new Map()
  .set(true, 7)
  .set({foo: 3}, [&#39;abc&#39;]);
[...myMap]
// [ [ true, 7 ], [ { foo: 3 }, [ &#39;abc&#39; ] ] ]

var outArray = Array.from(myMap);

(2)数组 转为 Map

将数组传入 Map 构造函数,就可以转为 Map。

new Map([
  [true, 7],
  [{foo: 3}, [&#39;abc&#39;]]
])
// Map {
//   true => 7,
//   Object {foo: 3} => [&#39;abc&#39;]
// }

(3)Map 转为对象

如果所有 Map 的键都是字符串,它可以无损地转为对象。

function strMapToObj(strMap) {
  let obj = Object.create(null);
  for (let [k,v] of strMap) {
    obj[k] = v;
  }
  return obj;
}

const myMap = new Map()
  .set(&#39;yes&#39;, true)
  .set(&#39;no&#39;, false);
strMapToObj(myMap)
// { yes: true, no: false }

如果有非字符串的键名,那么这个键名会被转成字符串,再作为对象的键名。

(4)对象转为 Map

对象转为 Map 可以通过Object.entries()

let obj = {"a":1, "b":2};
let map = new Map(Object.entries(obj));

此外,也可以自己实现一个转换函数。

function objToStrMap(obj) {
  let strMap = new Map();
  for (let k of Object.keys(obj)) {
    strMap.set(k, obj[k]);
  }
  return strMap;
}

objToStrMap({yes: true, no: false})
// Map {"yes" => true, "no" => false}

(5)Map 转为 JSON

Map 转为 JSON 要区分两种情况。一种情况是,Map 的键名都是字符串,这时可以选择转为对象 JSON。

function strMapToJson(strMap) {
  return JSON.stringify(strMapToObj(strMap));
}

let myMap = new Map().set(&#39;yes&#39;, true).set(&#39;no&#39;, false);
strMapToJson(myMap)
// &#39;{"yes":true,"no":false}&#39;

另一种情况是,Map 的键名有非字符串,这时可以选择转为数组 JSON。

function mapToArrayJson(map) {
  return JSON.stringify([...map]);
}

let myMap = new Map().set(true, 7).set({foo: 3}, [&#39;abc&#39;]);
mapToArrayJson(myMap)
// &#39;[[true,7],[{"foo":3},["abc"]]]&#39;

(6)JSON 转为 Map

JSON 转为 Map,正常情况下,所有键名都是字符串。

function jsonToStrMap(jsonStr) {
  return objToStrMap(JSON.parse(jsonStr));
}

jsonToStrMap(&#39;{"yes": true, "no": false}&#39;)
// Map {&#39;yes&#39; => true, &#39;no&#39; => false}

但是,有一种特殊情况,整个 JSON 就是一个数组,且每个数组成员本身,又是一个有两个成员的数组。这时,它可以一一对应地转为 Map。这往往是 Map 转为数组 JSON 的逆操作。

function jsonToMap(jsonStr) {
  return new Map(JSON.parse(jsonStr));
}

jsonToMap(&#39;[[true,7],[{"foo":3},["abc"]]]&#39;)
// Map {true => 7, Object {foo: 3} => [&#39;abc&#39;]}

其他

Map 的合并

var first = new Map([[1, &#39;one&#39;], [2, &#39;two&#39;], [3, &#39;three&#39;],]); 
var second = new Map([[1, &#39;uno&#39;], [2, &#39;dos&#39;]]); // 合并两个 Map 对象时,如果有重复的键值,则后面的会覆盖前面的,对应值即 uno,dos, three 
var merged = new Map([...first, ...second]);

Map 的克隆

var myMap1 = new Map([["key1", "value1"], ["key2", "value2"]]); 
var myMap2 = new Map(myMap1); 
console.log(original === clone); // 打印 false。 Map 对象构造函数生成实例,迭代出新的对象。

注意事项

注意,只有对同一个对象的引用,Map 结构才将其视为同一个键。这一点要非常小心。

const map = new Map();

map.set([&#39;a&#39;], 555);
map.get([&#39;a&#39;]) // undefined

虽然NaN不严格相等于自身,但 Map 将其视为同一个键。

let map = new Map();
map.set(NaN, 123);
map.get(NaN) // 123

【相关推荐:javascript视频教程编程视频

以上がes6 マップのメンバーはユニークですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。