Por que eu usaria o es6 Set prototype - 'entries'

5

De acordo com a documentação "Set" do mdn , entries é fornecido como um método de conveniência

...to keep the API similar to the Map object, each entry has the same value for its key and value here, so that an array [value, value] is returned.

Minha pergunta é qual é a finalidade de manter a API semelhante neste caso? ou seja, quando eu usaria o método entries para um conjunto?

    
por aaaaaa 18.12.2016 / 08:06
fonte

1 resposta

1

Set e Map têm APIs ligeiramente diferentes em termos de seus valores armazenados. Embora Set s contenha apenas valores, Map s também contém suas chaves associadas.

Por causa disso, se ambas as estruturas tiverem filter , map , forEach , ... funções como Array , a presunção de configuração de ação sobre cada valor iterado provavelmente será ligeiramente diferente , especificamente:

Map: function(key, value) { }
Set: function(value) { }

Porque, quando você já mantém as chaves em Map , faz sentido inspecionar o valor do key durante a iteração também.

Agora, se você encontrou uma situação em que gostaria de fazer uma iteração sobre qualquer uma das duas coleções, mas se preocupava apenas com o valor, precisaria de duas funções, uma para cada coleta de dados.

map.forEach((key, value) => console.log(value));
set.forEach(value => console.log(value));

Mesmo que você só se importe com o valor e a lógica de ambas as ações seja claramente a mesma, não é possível escrever uma função para atender às duas coleções. O método entries de Set e Map corrige esse problema fornecendo uma interface comum.

Criando a seguinte função (ou sua alternativa, eu não sou um desenvolvedor JS, então, por favor, desculpe qualquer imprecisão):

function forEach(entriesIterator, action) {
    let current = entriesIterator.next();
    while (current.done === false) {
        action(current.value[1]);

        current = entriesIterator.next();
    }
}

você pode alimentar entries de Map e / ou Set e ainda funcionará.

forEach(map.entries(), value => console.log(value));
forEach(set.entries(), value => console.log(value));

TLDR: O método entries fornece uma abstração para iterar em uma coleta de dados na qual você pode se preocupar apenas com os valores.

    
por 18.12.2016 / 13:38
fonte