ES6 set与map详解

// set 的创建
// (1)成员不能重复
// (2)只有键值没有键名,类似数组
// (3)可以遍历,方法有add, delete,has
// add(value) – 追加一个新的元素到Set中,返回Set对象,我们可以使用链式调用。
// clear() – 清空Set中的所有元素。
// delete(value) – 删除Set中的元素。
// entries()– 返回一个新的Iterator(可迭代对象)包含[value, value] 。
// forEach(callback [, thisArg]) – 像数组的forEach一样,并且每次调用会将this设置为thisArg
// has(value) – 判断Set中是否有该元素,返回true/false
// keys() – 和values()方法一样。
// [@@iterator] – 返回一个新的Iterator object(可迭代对象)。


const setObject = new Set();
//向set中添加元素 可以是任何元素
setObject.add(3);
setObject.add('哥');
//添加对象
setObject.add({ a: 1 });
//添加数组
setObject.add([1, 2, 3]);
// console.log(setObject) // 打印结果 Set(4) { 3, '哥', { a: 1 }, [ 1, 2, 3 ] }   4代表元素的长度
//has  检查set里面有没有某个元素
// console.log(setObject.has('哥')); // true  
// console.log(setObject.has('哥1')); // false  
//set 会去重相同的元素  
setObject.add(3);
setObject.add(3);
setObject.add(2);
setObject.add(2); // 向set的后面添加
// console.log(setObject) //打印结果  { 3, '哥', { a: 1 }, [ 1, 2, 3 ], 2 }
//set  与数组的转换    通过...拓展运算符将set变更为数组形式
const arry = [...setObject];
//set 的 delete
setObject.delete('哥')
    // console.log(setObject) //打印结果  { 3, , { a: 1 }, [ 1, 2, 3 ], 2 }
    // console.log(arry) //[ 3, '哥', { a: 1 }, [ 1, 2, 3 ], 2 ]

//利用 set求交集  
const set1 = new Set([1, 2, 3, 4, 5, 5, 5]);
const set2 = new Set([4, 5, 6, 7, 8, 9]);
// console.log(set1)
// console.log(set2)
//迭代整个set
//便利其中一个set 然后利用has 属性相同的就返回true 完成交集
let intersection = new Set([...set1].filter((x) => set2.has(x)));
// console.log(intersection) //两交集的交集 {4,5}
//找差集
let intersection2 = new Set([...set1].filter((x) => !set2.has(x)));
// console.log(intersection2) //    set1  在 set2 中的差集
let intersection3 = new Set([...set2].filter((x) => !set1.has(x)));
// console.log(intersection3) //    set2  在 set1 中的差集
let mySet = new Set([1, "some text", { "a": 1, "b": 2 }, { "a": 1, "b": 2 }])

// for (let item of mySet) console.log(item); //输出顺序 依次  1  some text { a: 1, b: 2 } { a: 1, b: 2 }   (键与值相等)
// 使用.size来获取Set的长度,这和数组length不同
// console.log(mySet.size)
//
//Map: map类似于对象    set2.has(x)
// (1)本质上是健值对的集合,类似集合
// (2)可以遍历,可以跟各种数据格式转换

// map.has('a')        //true
// map.get('a')        //a
// map.set('c': 3)        //Map(3) {'a' => 1, 'b' => 2, 'c' => 3}
// map.delete('a')    //Map(2) {'b' => 2, 'c' => 3}
// map.size        //2
// map.keys()    //MapIterator {'a', 'b', 'c'} 可迭代对象
// map.values()    //MapIterator {1, 2, 3} 可迭代对象
// map.entries()    //MapIterator {'a' => 1, 'b' => 2, 'c' => 3} 可迭代对象
// map.clear();    //清空map

const mapObject = new Map([
    ['a', 1],
    ['b', 2]
]);
// 1. map的遍历
mapObject.forEach((value, key) => {
    // console.log(value, key)
    // 1 a
    // 2 b
});
// 2. map转换数组  
// (1)
// console.log([...mapObject]); //[ [ 'a', 1 ], [ 'b', 2 ] ]
// (2)
// console.log(Array.from(mapObject)) //[ [ 'a', 1 ], [ 'b', 2 ] ]
// (3)
let arr = [];
for (var key of mapObject) {
    arr.push(key);
}
// console.log(arr); //[ [ 'a', 1 ], [ 'b', 2 ] ]

//3. map克隆/合并
let original = new Map([
    [1, 'one']
]);

let clone = new Map(original);

console.log(clone.get(1)); // one
console.log(original === clone); // false. 浅比较 不为同一个对象的引用
posted @ 2022-05-09 18:04  小猴子会上树  阅读(103)  评论(0编辑  收藏  举报