es6 新增的集合类型数据-Map和Set,他们是对原有的对象和数组类型的集合数据的补充。
1、map类型
map和对象 都是键值对集合的形式,但结构不太一样。对象中,键值对 是以`:`关联,map中一个键值对是一个数组。
{
// 对象的键值对结构
name : '张三',
gender : '男',
age : 18
}
const entries = [
// map键值对结构
['name', '张三'],
['gender', '男'],
['age', 18]
];
// 上面定义的entries是接入map所需要的数据结构,称为入口
// 接下来要使用Map构造函数 将二维数组 转为map类型数据
const map = new Map(entries);
// map数据 存储在一个独立的空间-[[entries]]
// 它和对象数据不在一起 也不会原型链中的键冲突
Map的操作方法:
// 1、使用set 向集合中写入键值对
map2.set(f, 1); // {function => 1}
map2.set(o, 2); // {{} => 2}
map2.set(bool, 3); // {true => 3}
// 2、使用get读取某个键的值,因为map的键类型比较特殊,
// 它在取值时 是按照sameZero方案比较的,相等才能取到值
// f == function () {} 不成立
console.log(map2.get(f), map2.get(function () {}));
// 1 undefined
// o == {} 不成立
console.log(map2.get(o), map2.get({})); // 2 undefined
// bool == true 成立
console.log(map2.get(bool), map2.get(true)); // 3 3
// 3、has检测是否存在某个键
console.log(map2.has(f), map2.has(function () {})); // true false
console.log(map2.has(o), map2.has({})); // true false
console.log(map2.has(bool), map2.has(true)); // true true
// 4、delete删除某个键
map2.delete(true);
// 5、clear清空集合
map2.clear();
// 迭代map对象,map的数据是二维数组形式 每次迭代出来的是一维数组
map和数组的相互转化:
// 数组转化成map
const entries = [
['name', 'zhangsan'],
['gender', 'nan'],
['age', 18]
];
const map = new Map(entries)
// map转化成数组:根据迭代的规则 可以逐个取键值对,用spread展开运算 拿到每个键值对再放入一个数组中
const arr = [...map];
console.log(arr);
//map类型对象和普通对象的相互转化:
const o = {
name : 'lisi',
gender : 'nv',
age : 19,
}
// 先将对象 转成二维数组形式
const data = Object.entries(o)
console.log(data);
// 将二维数组 作为入口数据给Map
console.log(new Map(data));
2、set数据类型
// Map类型,键值对数据的集合,可以看成是对象数据的补充和优化
// Set类型就是对数组的补充,它允许你存储任何类型的`唯一`值
// 普通的数组 也可以存储任意类型值,且允许重复,但Set集合元素是不重复
var arr = [1, true, 'a', function () {}, {}, 'a', 1];
// 使用Set构造函数 来创建set集合数据
const set = new Set(arr);
// set集合数据 也是存储在独立的空间, 具备map的多数特征
// 区别是map是键值对,set只有值 没有键
console.log(set);
set和数组的相互转化:
// 将数组 使用Set构造函数实例化转成set类型
const arr = [1, 'a', true, undefined];
const set2 = new Set(arr);
console.log(set2);
// set类型转成数组,以数组方式展开set集合
const arr2 = [...set2];
数组去重:
const a = [1, 2, 3, 1, 1, 2];
// 1、借助Set的唯一性 实现去重
const tmp = new Set(a);
const a2 = [...tmp];
2、
const newArr = [];
a.forEach(item => {
// if (newArr.indexOf(item) < 0) {
// newArr.push(item)
// }
if (!newArr.includes(item)) {
newArr.push(item)
}
});
console.log(newArr);
// 3、手动去重 - 修改原数组
for (let j = 0; j < a.length - 1; j++) {
for (let i = j+1; i < a.length; i++) {
if (a[j] == a[i]) {
// 删除后面的数
a.splice(i, 1);
// 回退一位
i--;
}
}
}
console.log(a);