Set
对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。存储的是类数组数据。不是键值对。
var mySet = new Set();
mySet.add(1); // Set [ 1 ]
mySet.add(5); // Set [ 1, 5 ]
mySet.add(5); // Set [ 1, 5 ]
mySet.add({ a: 1, b: 2 }); // Set [ 1, 5, {a: 1, b: 2}]
mySet.add({ a: 1, b: 2 }); // Set [ 1, 5, {a: 1, b: 2}, {a: 1, b: 2}]
console.log(mySet);
移除 Set 对象内的所有元素
var mySet = new Set();
mySet.clear();
移除 Set 的中与这个值相等的元素
var mySet = new Set();
mySet.add("foo");
mySet.delete("foo");
所有的值迭代
var mySet = new Set();
mySet.add("foo");
mySet.add("bar");
mySet.add("baz");
var setIter = mySet.values();
console.log(setIter.next().value); // "foo"
console.log(setIter.next().value); // "bar"
console.log(setIter.next().value); // "baz"
数组去重
const numbers = [2, 3, 4, 4, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 5, 32, 3, 4, 5];
//用...(展开操作符)操作符将Set转换为Array
console.log([...new Set(numbers)]);
// [2, 3, 4, 5, 6, 7, 32]
Map
JavaScript 的对象,键必须是字符串.为了解决这个问题,最新的 ES6 规范引入了新的数据类型 Map。Map 是一组键值对的结构,具有极快的查找速度。
对象保存键值对,并且能够记住键的原始插入顺序。Map 在涉及频繁增删键值对的场景下会有些性能优势
一个 Object 有一个原型,Map 默认情况不包含任何键。只包含显式插入的键。一个 Map 的键可以是任意值,包括函数、对象或任意基本类型。一个 Object 的键必须是一个 String 或是 Symbol。Map 在频繁增删键值对的场景下表现更好。
var x = new Map();
x.set("key", { x: 3, y: 5 });
console.log(x.get("key"));
一个 Object 的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值,包括函数、对象、基本类型。
Map 中的键值是有序的,而添加到对象中的键则不是。因此,当对它进行遍历时,Map 对象是按插入的顺序返回键值。
使用 for…of 方法迭代 Map
var x = new Map();
x.set("key", { x: 3, y: 5 });
for (var [key, value] of x) {
console.log(key + " = " + value); // key = [object Object]
}
使用 forEach() 方法迭代 Map
var x = new Map();
x.set("key", { x: 3, y: 5 });
x.forEach(function (value, key) {
console.log(key + " = " + value); // key = [object Object]
});
二维键值对数组转换成一个 Map 对象
var kvArray = [
["key1", "value1"],
["key2", "value2"],
];
var myMap = new Map(kvArray);
myMap.get("key1"); // "value1"
将一个 Map 对象转换成一个二维键值对数组
var x = new Map();
x.set("key1", { x: 3, y: 5 });
x.set("key2", "val2");
// [["key1",{x: 3, y: 5}],["key2","val2"]]
console.log(Array.from(x));
// [["key1",{x: 3, y: 5}],["key2","val2"]]
console.log([...x]); // 使用了展开运算符
移除 Map 对象的所有键/值对
var myMap = new Map();
// do sth
myMap.clear();
移除一个键值对
var x = new Map();
x.set("bar", "foo");
x.delete("bar");
获得所有键
var x = new Map();
x.set("key1", { x: 3, y: 5 });
x.set("key2", "val2");
var keys = x.keys();
console.log(keys.next().value); // key1
console.log(keys.next().value); // key2
获得所有值
var x = new Map();
x.set("key1", { x: 3, y: 5 });
x.set("key2", "val2");
var values = x.values();
console.log(values.next().value); // {x: 3, y: 5}
console.log(values.next().value); // val2