Set和Map

109 阅读3分钟

产生起因:

JavaScript的默认对象表示方式{}可以视为其他语言中的MapDictionary的数据结构,即一组键值对。

但是JavaScript的对象有个小问题,就是键必须是字符串。但实际上Number或者其他数据类型作为键也是非常合理的。为了解决这个问题,最新的ES6规范引入了新的数据类型Mapset.

Set是一种叫做集合的数据结构,Map是一种叫做字典的数据结构

Set (集合)[类数组]

应用场景

数组去重和数据存储

const s = new Set();

[2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));

for (let i of s) {
  console.log(i);   // 2 3 5 4
}

// 去除数组的重复成员
let array = [1,2,1,4,5,3];
[...new Set(array)]     // [1, 2, 4, 5, 3]

方法和属性

属性
size:返回字典所包含的元素个数
操作方法
-   add(value):添加某个值,返回 Set 结构本身。

-   delete(value):删除某个值,返回一个布尔值,表示删除是否成功。

-   has(value):返回一个布尔值,表示该值是否为 Set 的成员。

-   clear():清除所有成员,无返回值。

-   size: 返回set数据结构的数据长度
    let set1 = new Set([111,211])
    //1.属性 size:返回字典所包含的元素个数
    console.log(set1.size)//2

    //操作方法
    //1.delete(value)
    console.log(set1.add(99))//Set [1,2,99]
    //2.delte(value)
    console.log(set1.delete(99))//true
    //3.has(value)
    console.log(set1.has(111))//true
    //4.clear(value)
    console.log(set1.clear())//无返回值
    console.log(set1)//Set(0) {size: 0}
遍历方法
-   keys():返回键名的遍历器
-   values():返回键值的遍历器
-   entries():返回键值对的遍历器

-   forEach():使用回调函数遍历每个成员,无返回值

    let set = new Set(['a', 'b', 'c']);
    
    //keys():返回键名的遍历器
    console.log(set.keys())//SetIterator {'a', 'b', 'c'}
    console.log([...set.keys()])//['a', 'b', 'c']

    //values():返回键值的遍历器
    console.log(set.values()); // SetIterator {"a", "b", "c"}
    console.log([...set.values()]); // ["a", "b", "c"]

    //entries():返回键值对的遍历器
    console.log(set.entries()); // SetIterator {"a", "b", "c"}
    console.log([...set.entries()]); // [["a", "a"], ["b", "b"], ["c", "c"]]

    //forEach():使用回调函数遍历每个成员,无返回值
    let set5 = new Set(['a', 2, 3]);
    set5.forEach((value, key) => console.log(key + ': ' + value));
    // a: a
    // 2: 2
    // 3: 3

Set与Array的区别

  • set 无序 元素不可以重复

  • Array 有序 元素可以重复

var myArray = ["value1", "value2", "value3"]; 

// 用Set构造器将Array转换为Set 
var mySet = new Set(myArray); 

mySet.has("value1"); // returns true 

// 用...(展开操作符)操作符将Set转换为Array 
console.log([...mySet]); // 与myArray完全一致
Array.from()

将Set类数组转化为真实的数组 跟 ... 类似

let arrayLike = {
    0: 'tom', 
    1: '65',
    2: '男',
    3: ['jane','john','Mary'],
    'length': 4
}
let arr = Array.from(arrayLike)
console.log(arr) // ['tom','65','男',['jane','john','Mary']]

Map (字典)[类对象]

它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适;

那么集合又和字典有什么区别呢:

  • 共同点:集合、字典可以存储不重复的值

  • 不同点:集合是以[值,值]的形式存储元素,字典是以[键,值]的形式存储

方法和属性总结