010-Set-Map数据结构(Set/ WeakSet / Map / WeakMap )

/**
 * 
 * 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数据结构进行存储
 * 
 */

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值