/**
*
* set-map数据结构(Set/ WeakSet / Map / WeakMap )
* set与Array类似,但集合中的元素是不能重复的
* map与Object类似,但key值可以是任意数据类型
*
* WeakSet和Set的区别
* 1.支持的数据类型不同
* WeakSet的元素只能是对象
* 2.WeakSet中的对象都是一个弱引用(不会检测对象是否在其他地方用过,是地址的引用)
* 3.WeakSet与Set相比
* 没有 .clear() .size() 方法
* 且不能遍历
* 4.用法与Set基本一致
*
* WeakMap和Map的区别
* 与WeakSet和Set的区别一致
*/
/******************************************************************* Set ********/
{ //set的普通定义方法
let list = new Set();
list.add(5); //增加一个数值5
list.add(7); //增加一个数值7
console.log('size',list.size); //获取Set的数据长度
}
{ //第2中定义Set数据方法
let arr = [1,2,3,4,5];
let list = new Set(arr);
console.log('size',list.size); //获取Set的数据长度
}
{ //Set集合中的元素,必须是唯一的(特性应用: 去重)
let list = new Set();
list.add(1);
list.add(2);
list.add(1); //重复(无法成功添加)
console.log('list',list); //1 2
let arr=[1,2,3,1,'2'];
let list2=new Set(arr); //在特性去重过程中,不会转换数据类型
console.log('unique',list2); //1 2 3 '2'
}
{ //set常用的方法
let arr=['add','delete','clear','has'];
let list=new Set(arr);
console.log('has',list.has('add')); //判断set集合中是否有某个元素 {return Boolean}
console.log('delete',list.delete('add'),list); //阐述set集合中某个元素 {return Boolean}
list.clear(); //清空set集合中的元素
console.log('list',list);
}
{ //set数据的遍历(类似于Array)
let arr=['add','delete','clear','has'];
let list=new Set(arr);
for(let key of list.keys()){ //.keys() 获取set数据key值
console.log('keys',key);
}
for(let value of list.values()){ //.valuse() 获取set数据values值
console.log('value',value);
}
for(let [key,value] of list.entries()){ //.entries() 获取set数据 key+values值
console.log('entries',key,value);
}
list.forEach(
function(item){
console.log(item);
}
)
}
/******************************************************************* WeakSet ********/
{
let weakList=new WeakSet();
let arg={};
weakList.add(arg);
// weakList.add(2); //添加非对象数据类型会直接报错
console.log('weakList',weakList);
}
/******************************************************************* Map ********/
{ //基础用法
let map = new Map();
let arr=['123'];
map.set(arr,456); //添加元素(以arr数组为key)
console.log('map',map,map.get(arr)); //.get()获取某个key的values
}
{ //第2中定义方式
let map = new Map([ ['a',123],['b',456] ]); //定义Map
console.log('map args',map);
console.log('size',map.size); //获取Map数据的长度
console.log('delete',map.delete('a'),map); //删除 {return Boolean}
console.log('clear',map.clear(),map); //清空 {return Boolean}
}
/**
* Map数据的遍历与Set数据一致(不再列举)
*/
/******************************************************************* WeakMap ********/
{ //WeakMap key值必须是对象
let weakmap=new WeakMap();
let o={};
weakmap.set(o,123);
console.log(weakmap.get(o));
}
/******************************************************************* map和Array的对比 ********/
{ //map和array的对比(结论,map比array更简便)
// 数据结构横向对比,增,查,改,删
let map=new Map();
let array=[];
// 增
map.set('t',1);
array.push({t:1});
console.info('map-array',map,array);
// 查
let map_exist=map.has('t');
let array_exist=array.find(item=>item.t);
console.info('map-array',map_exist,array_exist);
// 改
map.set('t',2);
array.forEach(item=>item.t?item.t=2:'');
console.info('map-array-modify',map,array);
// 删
map.delete('t');
let index=array.findIndex(item=>item.t);
array.splice(index,1);
console.info('map-array-empty',map,array);
}
/******************************************************************* set和Array的对比 ********/
{
// set和array的对比(结论:set和map操作都相对复杂)
let set=new Set();
let array=[];
// 增
set.add({t:1});
array.push({t:1});
console.info('set-array',set,array);
// 查
let set_exist=set.has({t:1});
let array_exist=array.find(item=>item.t);
console.info('set-array',set_exist,array_exist);
// 改
set.forEach(item=>item.t?item.t=2:'');
array.forEach(item=>item.t?item.t=2:'');
console.info('set-array-modify',set,array);
// 删
set.forEach(item=>item.t?set.delete(item):'');
let index=array.findIndex(item=>item.t);
array.splice(index,1);
console.info('set-array-empty',set,array);
}
/******************************************************************* map,set,object对比 ********/
{
// map,set,object对比
let item={t:1};
let map=new Map();
let set=new Set();
let obj={};
// 增
map.set('t',1);
set.add(item);
obj['t']=1;
console.info('map-set-obj',obj,map,set);
// 查
console.info({
map_exist:map.has('t'),
set_exist:set.has(item),
obj_exist:'t' in obj
})
// 改
map.set('t',2);
item.t=2;
obj['t']=2;
console.info('map-set-obj-modify',obj,map,set);
// 删除
map.delete('t');
set.delete(item);
delete obj['t'];
console.info('map-set-obj-empty',obj,map,set);
}
/** **********************************************************************************************
* 通过对比得出结论:
* 操作数组对象时: Map比 Set/Array相对比较简单
* 操作对象时 : Map比 Set/Object相对成本更低(相差不多)
*
* 综上比较发现:
* 对于Object和Array数据结构时,应当优先选用 Map数据结构进行存储,
* 但如果考虑对数据存储的唯一性,则应当选用 Set数据结构进行存储
*
*/