<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>JS中MAP的用法示例</title>
<script>
var myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "one");
console.log('---------------------------------------------------')
console.log(myMap.get(0)); //returns zero
console.log(myMap.get("zero")); //returns undefined
console.log(myMap.size);
console.log(myMap.has(0)); // returns true
console.log(myMap.has("zero")); // returns false
//console.log(myMap.delete(0));
//myMap.clear();
//console.log(myMap.size);
for (var [key, value] of myMap) {
console.log(key + " = " + value);
}
// 將會顯示兩個log。一個是"0 = zero"另一個是"1 = one"
console.log('---------------------------------------------------')
for (var key of myMap.keys()) {
console.log(key);
}
// 將會顯示兩個log。 一個是 "0" 另一個是 "1"
console.log('---------------------------------------------------')
for (var value of myMap.values()) {
console.log(value);
}
// 將會顯示兩個log。 一個是 "zero" 另一個是 "one"
console.log('---------------------------------------------------')
for (var [key, value] of myMap.entries()) {
console.log(key + " = " + value);
}
// 將會顯示兩個log。 一個是 "0 = zero" 另一個是 "1 = one"
console.log('---------------------------------------------------')
var kvArray = [["key1", "value1"], ["key2", "value2"]];
// 使用常規的Map構造函數可以將一個二維鍵值對數組轉換成一個Map對象
var myMap = new Map(kvArray);
myMap.get("key1"); // 返回值爲 "value1"
// 使用Array.from函數可以將一個Map對象轉換成一個二維鍵值對數組
console.log(Array.from(myMap)); // 輸出和kvArray相同的數組
// 或者在鍵或者值的迭代器上使用Array.from,進而得到只含有鍵或者值的數組
console.log(Array.from(myMap.keys())); // 輸出 ["key1", "key2"]
console.log('---------------------------------------------------')
var original = new Map([
[0, "zero"],
[1, 'one'],
[2, 'two'],
]);
var clone = new Map(original);
console.log(clone.get(1)); // one
console.log(clone.get(2)); // one
console.log(original === clone); // false. Useful for shallow comparison
var first = new Map([
[1, 'one'],
[2, 'two'],
[3, 'three'],
]);
var second = new Map([
[1, 'uno'],
[2, 'dos']
]);
// 合併兩個Map對象時,如果有重複的鍵值,則後面的會覆蓋前面的。
// 展開運算符本質上是將Map對象轉換成數組。
var merged = new Map([...first, ...second]);
for (var [key, value] of merged) {
console.log(key + " = " + value);
}
</script>
</head>
<body>
</body>
</html>
/*
* MAP對象,實現MAP功能
*
* 接口:
* size() 獲取MAP元素個數
* isEmpty() 判斷MAP是否爲空
* clear() 刪除MAP所有元素
* put(key, value) 向MAP中增加元素(key, value)
* remove(key) 刪除指定KEY的元素,成功返回True,失敗返回False
* get(key) 獲取指定KEY的元素值VALUE,失敗返回NULL
* element(index) 獲取指定索引的元素(使用element.key,element.value獲取KEY和VALUE),失敗返回NULL
* containsKey(key) 判斷MAP中是否含有指定KEY的元素
* containsValue(value) 判斷MAP中是否含有指定VALUE的元素
* values() 獲取MAP中所有VALUE的數組(ARRAY)
* keys() 獲取MAP中所有KEY的數組(ARRAY)
*
* 例子:
* var map = new Map();
*
* map.put("key", "value");
* var val = map.get("key")
* ……
*
*/
function Map() {
this.elements = new Array();
//獲取MAP元素個數
this.size = function() {
return this.elements.length;
};
//判斷MAP是否爲空
this.isEmpty = function() {
return (this.elements.length < 1);
};
//刪除MAP所有元素
this.clear = function() {
this.elements = new Array();
};
//向MAP中增加元素(key, value)
this.put = function(_key, _value) {
this.elements.push( {
key : _key,
value : _value
});
};
//刪除指定KEY的元素,成功返回True,失敗返回False
this.removeByKey = function(_key) {
var bln = false;
try {
for (i = 0; i < this.elements.length; i++) {
if (this.elements[i].key == _key) {
this.elements.splice(i, 1);
return true;
}
}
} catch (e) {
bln = false;
}
return bln;
};
//刪除指定VALUE的元素,成功返回True,失敗返回False
this.removeByValue = function(_value) {//removeByValueAndKey
var bln = false;
try {
for (i = 0; i < this.elements.length; i++) {
if (this.elements[i].value == _value) {
this.elements.splice(i, 1);
return true;
}
}
} catch (e) {
bln = false;
}
return bln;
};
//刪除指定VALUE的元素,成功返回True,失敗返回False
this.removeByValueAndKey = function(_key,_value) {
var bln = false;
try {
for (i = 0; i < this.elements.length; i++) {
if (this.elements[i].value == _value && this.elements[i].key == _key) {
this.elements.splice(i, 1);
return true;
}
}
} catch (e) {
bln = false;
}
return bln;
};
//獲取指定KEY的元素值VALUE,失敗返回NULL
this.get = function(_key) {
try {
for (i = 0; i < this.elements.length; i++) {
if (this.elements[i].key == _key) {
return this.elements[i].value;
}
}
} catch (e) {
return false;
}
return false;
};
//獲取指定索引的元素(使用element.key,element.value獲取KEY和VALUE),失敗返回NULL
this.element = function(_index) {
if (_index < 0 || _index >= this.elements.length) {
return null;
}
return this.elements[_index];
};
//判斷MAP中是否含有指定KEY的元素
this.containsKey = function(_key) {
var bln = false;
try {
for (i = 0; i < this.elements.length; i++) {
if (this.elements[i].key == _key) {
bln = true;
}
}
} catch (e) {
bln = false;
}
return bln;
};
//判斷MAP中是否含有指定VALUE的元素
this.containsValue = function(_value) {
var bln = false;
try {
for (i = 0; i < this.elements.length; i++) {
if (this.elements[i].value == _value) {
bln = true;
}
}
} catch (e) {
bln = false;
}
return bln;
};
//判斷MAP中是否含有指定VALUE的元素
this.containsObj = function(_key,_value) {
var bln = false;
try {
for (i = 0; i < this.elements.length; i++) {
if (this.elements[i].value == _value && this.elements[i].key == _key) {
bln = true;
}
}
} catch (e) {
bln = false;
}
return bln;
};
//獲取MAP中所有VALUE的數組(ARRAY)
this.values = function() {
var arr = new Array();
for (i = 0; i < this.elements.length; i++) {
arr.push(this.elements[i].value);
}
return arr;
};
//獲取MAP中所有VALUE的數組(ARRAY)
this.valuesByKey = function(_key) {
var arr = new Array();
for (i = 0; i < this.elements.length; i++) {
if (this.elements[i].key == _key) {
arr.push(this.elements[i].value);
}
}
return arr;
};
//獲取MAP中所有KEY的數組(ARRAY)
this.keys = function() {
var arr = new Array();
for (i = 0; i < this.elements.length; i++) {
arr.push(this.elements[i].key);
}
return arr;
};
//獲取key通過value
this.keysByValue = function(_value) {
var arr = new Array();
for (i = 0; i < this.elements.length; i++) {
if(_value == this.elements[i].value){
arr.push(this.elements[i].key);
}
}
return arr;
};
//獲取MAP中所有KEY的數組(ARRAY)
this.keysRemoveDuplicate = function() {
var arr = new Array();
for (i = 0; i < this.elements.length; i++) {
var flag = true;
for(var j=0;j<arr.length;j++){
if(arr[j] == this.elements[i].key){
flag = false;
break;
}
}
if(flag){
arr.push(this.elements[i].key);
}
}
return arr;
};
}