Análise dos tipos de mapas e conjuntos

Mapa

Introdução

MapA estrutura de dados é semelhante à JavaScriptdo 对象, mas a chave do objeto pode ser apenas uma string e a chave do Map pode ser 任意类型的值. Deve-se notar que as chaves de um mapa estão vinculadas a endereços de memória, portanto algumas chaves aparentemente idênticas têm valores diferentes, o que será ilustrado a seguir com exemplos.

MapO benefício da vinculação de chave e endereço de memória é evitar a colisão/conflito de atributos com o mesmo nome, portanto, quando expandimos as bibliotecas de outras pessoas, não precisamos nos preocupar em destruir o valor original.

O mapa pode aceitar uma matriz como parâmetro, mas os membros da matriz precisam ser matrizes que representam pares chave-valor.

const map = new Map([
  ['name', '张三'],
  ['age', '18']
]);
// {'name': '张三', 'age': '18'}

método de operação

map.has('name') // 判断是否存在某个键,返回true/false
map.get('name') // 获取某个键的值,如果不存在,则返回 undefined
map.set('sex', '男') // 添加成员,如果添加重复的键,会覆盖已存在的值
map.delete('sex') // 删除某个值,成功返回 true,失败返回 false

As teclas do Mapa estão vinculadas à memória, portanto preste atenção especial a isso. Dê uma olhada nos dois conjuntos de exemplos abaixo:

Dois valores que devem ser estritamente iguais para que o Map os considere a mesma chave, exceto NaN.

const map = new Map();

map.set(['a'], 666);
map.get(['a']) // undefined
const map = new Map();
const a = ['a']

map.set(a, 666);
map.get(a) // 666

atravessar

MapEle também pode ser percorrido como uma matriz , mas o método de operação é diferente e só pode ser percorrido por keys(), values(), e outros métodos. A interface padrão do Traverser é .entries()forEach()entries

const map = new Map([
  ['name', '张三'],
  ['age', '18']
]);

for (let item of map.keys()) {
    
    
  console.log(item);
}
// 'name'
// 'age'

for (let item of map.values()) {
    
    
  console.log(item);
}
// '张三'
// '18'

for (let item of map.entries()) {
    
    
  console.log(item);
}
// ['name', '张三']
// ['age', '18']

for (let [key, value] of map.entries()) {
    
    
  console.log(key, value);
}
// 'name' '张三'
// 'age' '18'

for (let [key, value] of map) {
    
    
  console.log(key, value);
}
// 'name' '张三'
// 'age' '18'

map.forEach(function(value, key, map) {
    
    });

Mapa Fraco

Introdução

WeakMapSemelhante a Map, mas a chave só pode ser 对象ou null, não outros tipos.Ao mesmo tempo, os membros em WeakMap são referências fracas, que não afetam o mecanismo de coleta de lixo.

Definir

Introdução

SetÉ ES6uma nova estrutura de dados fornecida, semelhante à estrutura de array, sua chave e valor são os mesmos e seu valor é único e não repetido.

SetEle próprio é um construtor usado para gerar Setestruturas de dados. Ao Setadicionar valores, o tipo do valor adicionado não será alterado.

SetPode aceitar uma matriz como parâmetro para inicializar.

const set = new Set([1, 2, 3, 4, 4, 4]);
[...set] // [1, 2, 3, 4]

adicionar membros

Os membros podem add()ser adicionados ao conjunto por meio do método, observe que os membros duplicados não podem ser adicionados.

const set = new Set([1, 2, 3, 4, 4, 4]);

set.add(1) // {1, 2, 3, 4}
set.add(5) // {1, 2, 3, 4, 5}

modificar membros

SetNão há como modificar o próprio membro, mas ele pode ser modificado de outras formas, como mapear um novo Conjunto.

let set = new Set([1, 2, 3]);
set = new Set([...set].map(val => val * 2));
// {2, 4, 6}

método de operação

Setalguns outros métodos.

const set = new Set([1, 2, 3, 4, 4, 4]);

set.add(5) // 添加成员
set.delete(1) // 删除成员
set.has(5) // 判断成员是否存在,返回 true/false
set.clear() // 清空所有成员

atravessar

SetEle também pode ser percorrido como uma matriz , mas o método de operação é diferente e só pode ser percorrido por keys(), values(), e outros métodos.entries()forEach()

const set = new Set([1, 2, 3]);

for (let item of set.keys()) {
    
    
  console.log(item);
}
// 1
// 2
// 3

for (let item of set.values()) {
    
    
  console.log(item);
}
// 1
// 2
// 3

for (let item of set.entries()) {
    
    
  console.log(item);
}
// [1, 1]
// [2, 2]
// [3, 3]

set.forEach((value, key) => console.log(key + ' : ' + value))
// 1 : 1
// 2 : 2
// 3 : 3

intersecção, união, diferença

Usando as características de travessia e Settipos de dados que não possuem valores duplicados, você pode facilmente obter interseção, união e diferença.

const a = new Set([1, 2, 3]);
const b = new Set([3, 4, 5]);

// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
// set {3}

// 并集
let union = new Set([...a, ...b]);
// Set {1, 2, 3, 4, 5}

// 差集
let difference = new Set([...a].filter(x => !b.has(x)));
// Set {1, 2, 4, 5}

Conjunto Fraco

Introdução

WeakSetSemelhante Set, também é uma coleção de valores exclusivos, mas o valor de WeakSet pode ser apenas um objeto (não-objeto relatará um erro) e os objetos em WeakSet são todos referências fracas.

O mecanismo de coleta de lixo não considera as referências aos objetos no WeakSet.Se não houver outras referências aos objetos no WeakSet, a coleta de lixo limpará os objetos no WeakSet.

const ws = new WeakSet([[1, 2], [3, 4]]);
// {[1, 2], [3, 4]}

método de operação

const ws = new WeakSet();
const obj = {
    
    };

ws.add(obj) // 添加成员
ws.delete(obj) // 删除成员
ws.has(obj) // 判断成员是否存在,返回 true/false

Nota: WeakSets não podem ser percorridos.

FIM

Acho que você gosta

Origin blog.csdn.net/m0_53808238/article/details/131230468
Recomendado
Clasificación