数据结构Set、Map

在整个的数据开发过程中,涉及到数据结构,能用Map就不使用数组,尤其是复杂的数据结构。如果对要求存储的数据有唯一性要求,推荐使用Set。

快速导航

set

类似于数组,但它的一大特性就是集合中的所有元素都是唯一,没有重复。

  • 方法介绍

    • add:添加一个元素
    • delete:删除一个元素
    • clear:清空所有元素
    • has:查看集合中是否包含指定元素
    • size:相当于数组中的length
  • 使用示例

  1. {
  2. let list = new Set(); // 创建一个Set集合
  3. list.add(5);
  4. list.add(7);
  5. console.log('size',list.size); //2
  6. }
  1. {
  2. let arr=['add','delete','clear','has'];
  3. let list=new Set(arr);
  4. list.add('add1');
  5. console.log('has',list.has('add')); //has true
  6. console.log('delete',list.delete('add'),list); //delete true Set {"delete", "clear", "has", "add1"}
  7. list.clear();
  8. console.log('list',list); //list Set {}
  9. }
  • 数组去重

    以利用这一唯一特性进行数组的去重工作。

  1. {
  2. let list = new Set();
  3. list.add(1);
  4. list.add(2);
  5. list.add(1);
  6. console.log('list',list); //list Set {1, 2}
  7. //数字2 与 字符串'2'严格意义上是不相等的
  8. let arr=[1,2,3,1,'2'];
  9. let list2=new Set(arr);
  10. console.log('unique',list2); //unique Set {1, 2, 3, "2"}
  11. //以数组的形式输出
  12. console.log([...list2]); // (4) [1, 2, 3, "2"]
  13. }
  • 集合遍历

    1. {
    2. let arr=['add','delete','clear','has'];
    3. let list=new Set(arr);
    4. for(let key of list.keys()){
    5. console.log('keys',key);
    6. }
    7. //keys add keys delete 5 keys clear keys has
    8. for(let value of list.values()){
    9. console.log('value',value);
    10. }
    11. //value add value delete value clear value has
    12. for(let [key,value] of list.entries()){
    13. console.log('entries',key,value);
    14. }
    15. //entries add add entries delete delete entries clear clear entries has has
    16. list.forEach(function(item){console.log(item);})
    17. //add delete clear has
    18. }

    weakset

weakset的元素只能是对象,WeakSet中的对象是弱引用,只是把地址拿过来,没有clear属性,不能遍历

  1. {
  2. let weakList=new WeakSet();
  3. let arg={a:'1'};
  4. weakList.add(arg);
  5. weakList.add({b:'2'});
  6. console.log('weakList',weakList);
  7. //weakList WeakSet {Object {b: "2"}, Object {a: "1"}}
  8. }

map

Map中的key可以是任意数据类型:字符串、数组、对象等要注意集合Set添加元素用add(),而集合Map添加元素用set()

  • 第一种定义方式
  1. let map = new Map();
  2. let arr=['123'];
  3. map.set(arr,456);
  4. console.log('map',map,map.get(arr));
  5. //map Map {["123"] => 456} 456
  • 第二种定义方式
  1. let map = new Map([['a',123],['b',456]]);
  2. console.log('map args',map);
  3. //map args Map {"a" => 123, "b" => 456}
  4. //size delete clear方法 与 遍历同set一样
  5. console.log('size',map.size); //size 2
  6. console.log('delete',map.delete('a'),map); //delete true Map {"b" => 456}
  7. map.clear();
  8. console.log('clear',map); //clear Map {}

weakmap

同WeakSet一样接收的key值必须是对象,没有size属性,clear方法,也是不能遍历

  1. {
  2. let weakmap=new WeakMap();
  3. let o={};
  4. weakmap.set(o,123);
  5. console.log(weakmap.get(o)); //123
  6. }

map与array对比

Map与Array横向对比增、查、改、删

  1. let map=new Map();
  2. let array=[];
  1. map.set('t',1);
  2. array.push({t:1});
  3. console.info('map-array',map,array); // map-array Map {"t" => 1} [Object]
  1. let map_exist=map.has('t');
  2. let array_exist=array.find(item=>item.a);
  3. console.info('map-array',map_exist,!!array_exist); // map-array true false
  1. map.set('t',2);
  2. array.forEach(item=>item.t?item.t=2:'');
  3. console.info('map-array-modify',map,array); // map-array-modify Map {"t" => 2} [Object]
  1. map.delete('t');
  2. let index=array.findIndex(item=>item.t);
  3. array.splice(index,1);
  4. console.info('map-array-empty',map,array); // map-array-empty Map {} []

set与array

Set与Array增、查、改、删对比

  1. let set=new Set();
  2. let array=[];
  1. set.add({t:1});
  2. array.push({t:1});
  3. // set-array Set {Object {t: 1}} [Object]
  4. console.info('set-array',set,array);
  1. let set_exist=set.has({t:1}); // 没有对象引用,将一直为false
  2. let array_exist=array.find(item=>item.t);
  3. // set-array false Object {t: 1}
  4. console.info('set-array',set_exist,array_exist);
  1. set.forEach(item=>item.t?item.t=2:'');
  2. array.forEach(item=>item.t?item.t=2:'');
  3. // set-array-modify Set {Object {t: 2}} [Object]
  4. console.info('set-array-modify',set,array);
  1. set.forEach(item=>item.t?set.delete(item):'');
  2. let index=array.findIndex(item=>item.t);
  3. array.splice(index,1);
  4. // set-array-empty Set {} []
  5. console.info('set-array-empty',set,array);

集合map集合set对象三者对比

Map、Set、Object三者增、查、改、删对比

  1. let item={t:1};
  2. let map=new Map();
  3. let set=new Set();
  4. let obj={};
  1. map.set('t',1);
  2. set.add(item);
  3. obj['t']=1;
  4. // map-set-obj Object {t: 1} Map {"t" => 1} Set {Object {t: 1}}
  5. console.info('map-set-obj',obj,map,set);
  1. // Object {map_exist: true, set_exist: true, obj_exist: true}
  2. console.info({
  3. map_exist:map.has('t'),
  4. set_exist:set.has(item),
  5. obj_exist:'t' in obj
  6. })
  1. map.set('t',2);
  2. item.t=2;
  3. obj['t']=2;
  4. // map-set-obj-modify Object {t: 2} Map {"t" => 2} Set {Object {t: 2}}
  5. console.info('map-set-obj-modify',obj,map,set);
  1. map.delete('t');
  2. set.delete(item);
  3. delete obj['t'];
  4. // map-set-obj-empty Object {} Map {} Set {}
  5. console.info('map-set-obj-empty',obj,map,set);