Set

数据结构 - 图1> Set是ES6新的数据结构,类似数组,但成员的值是唯一的,没有重复的值。

Set 常用方法 遍历 应用场景 WeakSet 用法

  1. {
  2. // 向Set中加入值的时候不会发生类型转换,所以5和”5”是两个不同的值,
  3. // Set内部判断两个值是否相等,使用的是 ===,这就意味着这两个对象总是不相等。
  4. // 唯一列外的是NaN本身(精确相等运算符认为NaN不等于自身)
  5. let list = new Set();
  6. list.add(5);
  7. list.add(7);
  8. console.log("size", list.size); // size 2
  9. }
  10. {
  11. let arr = [1, 2, 3, 4, 5];
  12. let list = new Set(arr);
  13. console.log("size", list.size); // size 5
  14. }
  15. {
  16. // 唯一的
  17. let list = new Set();
  18. list.add(1);
  19. list.add(2);
  20. list.add(1);
  21. console.log("list", list); // list Set { 1, 2 }
  22. // 去重
  23. // 数组
  24. let arr = [1, 2, 3, 1, 2];
  25. let list2 = new Set(arr);
  26. console.log("unique", list2); // unique Set { 1, 2, 3 }
  27. // 对象数组
  28. const objArrays = [
  29. { id: 1 },
  30. { id: 1 },
  31. { id: 2 },
  32. { id: 1 },
  33. { id: 5 },
  34. { id: 7 },
  35. { id: 9 },
  36. ];
  37. const idSet = new Set();
  38. console.log(
  39. objArrays.filter((item) => {
  40. const existingId = idSet.has(item.id);
  41. idSet.add(item.id);
  42. return !existingId;
  43. })
  44. );
  45. // [ { id: 1 }, { id: 2 }, { id: 5 }, { id: 7 }, { id: 9 } ]
  46. }
  47. {
  48. let arr = ["add", "delete", "clear", "has"];
  49. let list = new Set(arr);
  50. console.log("has", list.has("add")); // has true
  51. console.log("delete", list.delete("add"), list); // delete true Set { 'delete', 'clear', 'has' }
  52. list.clear();
  53. console.log("list", list); // list Set { }
  54. }
  55. {
  56. let arr = ["add", "delete", "clear", "has"];
  57. let list = new Set(arr);
  58. for (let value of list) {
  59. console.log("value--", value);
  60. // value-- add
  61. // value-- delete
  62. // value-- clear
  63. // value-- has
  64. }
  65. for (let key of list.keys()) {
  66. console.log("key", key);
  67. // key add
  68. // key delete
  69. // key clear
  70. // key has
  71. }
  72. for (let value of list.values()) {
  73. console.log("value", value);
  74. // value add
  75. // value delete
  76. // value clear
  77. // value has
  78. }
  79. for (let [key, value] of list.entries()) {
  80. console.log("entries", key, value);
  81. // entries add add
  82. // entries delete delete
  83. // entries clear clear
  84. // entries has has
  85. }
  86. list.forEach(function (item) {
  87. console.log(item);
  88. // add
  89. // delete
  90. // clear
  91. // has
  92. });
  93. }
  94. {
  95. /*
  96. 1、WeakSet 成员只能够是对象
  97. 2、作为 WeakSet 成员的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在与WeakSet之中。这个特点意味着,无法引用WeakSet的成员,因此WeakSet是不可遍历的。
  98. 3、使用WeakSet存储对象实例的好处是,由于是对对象实例的引用,不会被计入内存回收机制,所以删除实例的时候,不用考虑weaket,也不会出现内存泄漏。
  99. */
  100. let weakList = new WeakSet();
  101. let arg = {};
  102. weakList.add(arg);
  103. weakList.add(2); // Invalid value used in weak set
  104. console.log("weakList", weakList); // weakList WeakSet {}
  105. // weakList.forEach((item) => {
  106. // console.log(item);
  107. // });
  108. // weakList.forEach is not a function 
  109. }

Map

数据结构 - 图2

  1. {
  2. let map = new Map();
  3. let arr = ["123"];
  4. map.set(arr, 456);
  5. console.log("map", map, map.get(arr));
  6. // map Map { [ '123' ] => 456 } 456
  7. }
  8. {
  9. let map = new Map([["a", 123], ["b", 456]]);
  10. console.log("map args", map); // map args Map { 'a' => 123, 'b' => 456 }
  11. console.log("size", map.size); // size 2
  12. console.log("delete", map.delete("a"), map); // delete true Map { 'b' => 456 }
  13. console.log("clear", map.clear(), map); // clear undefined Map { }
  14. }
  15. {
  16. let weakmap = new WeakMap();
  17. let o = {};
  18. weakmap.set(o, 123);
  19. console.log(weakmap.get(o)); // 123
  20. }
  21. // 数据结构
  22. // Map与Array的对比
  23. // Set与Array的对比
  24. {
  25. // 数据结构横向对比,增,查,改,删
  26. let map = new Map();
  27. let array = [];
  28. // 增
  29. map.set("t", 1);
  30. array.push({ t: 1 });
  31. console.log("map-array", map, array); // map-array Map { 't' => 1 } [ { t: 1 } ]
  32. // 查
  33. let map_exist = map.has("t");
  34. let array_exist = array.find(item => item.t);
  35. console.log("map-array", map_exist, array_exist); // map-array true { t: 1 }
  36. // 改
  37. map.set("t", 2);
  38. array.forEach(item => (item.t ? (item.t = 2) : ""));
  39. console.log("map-array-modify", map, array); // map-array-modify Map { 't' => 2 } [ { t: 2 } ]
  40. // 删
  41. map.delete("t");
  42. let index = array.findIndex(item => item.t);
  43. array.splice(index, 1);
  44. console.log("map-array-empty", map, array); // map-array-empty Map { } []
  45. }
  46. {
  47. // set和array的对比
  48. let set = new Set();
  49. let array = [];
  50. // 增
  51. set.add({ t: 1 });
  52. array.push({ t: 1 });
  53. console.log("set-array", set, array); // set-array Set { { t: 1 } } [ { t: 1 } ]
  54. // 查
  55. let set_exist = set.has({ t: 1 });
  56. let array_exist = array.find(item => item.t);
  57. console.log("set_exist", set_exist, array_exist); // set_exist false { t: 1 }
  58. // 改
  59. set.forEach(item => (item.t ? (item.t = 2) : ""));
  60. array.forEach(item => (item.t ? (item.t = 2) : ""));
  61. console.log("set_array-modify", set, array); // set_array-modify Set { { t: 2 } } [ { t: 2 } ]
  62. // 删
  63. set.forEach(item => (item.t ? set.delete(item) : ""));
  64. let index = array.findIndex(item => item.t);
  65. array.splice(index, 1);
  66. console.log("set-array-empty", set, array); // set-array-empty Set { } []
  67. }
  68. {
  69. // map,set,objet对比
  70. let item = { t: 1 };
  71. let map = new Map();
  72. let set = new Set();
  73. let obj = {};
  74. // 增
  75. map.set("t", 1);
  76. set.add(item);
  77. obj["t"] = 1;
  78. console.log("map-set-obj", obj, map, set); // map-set-obj { t: 1 } Map { 't' => 1 } Set { { t: 1 } }
  79. // 查
  80. console.log({
  81. map_exist: map.has("t"),
  82. set_exist: set.has(item),
  83. obj_exist: "t" in obj
  84. }); // { map_exist: true, set_exist: true, obj_exist: true }
  85. // 改
  86. map.set("t", 2);
  87. item.t = 2;
  88. obj["t"] = 2;
  89. console.log("map-set-obj-modify", obj, map, set); // map-set-obj-modify { t: 2 } Map { 't' => 2 } Set { { t: 2 } }
  90. // 删
  91. map.delete("t");
  92. set.delete(item);
  93. delete obj["t"];
  94. console.log("map-set-obj-empty", obj, map, set); // map-set-obj-empty {} Map { } Set { }
  95. }