Map em Javascript

1 resposta
jeovane.reges

Olá a todos, boa noite.
Pessoal estou tentando criar um Map (Map em java) em javascript, onde as chaves e os valores são adicionados dinamicamente, no entanto, quando tento "cria-los" de maneira dinâmica sempre acaba dando erro.

Tento criá-los a partir do seguinte código.
var key;
var value;
$(".conteudoMenu a").click(function(){
    // Obtenhos os valores das Keys
    key = $(this).parent(".conteudoMenu").parent("li").find(".itemMenu").attr("id");
   // Obtenho os valores do Values
    value = $(this).attr("id"); 

    // Método que chamo para adicionar as keys e os values
    Processar({ key : [value] });
});

var Processar = function(mapaDeListas) {
  // mapaDeListas[key] -> Cria o array com o nome da Key
  // Verifica se  existe chave vinda do "key" e se o valor de "value" está presente no array
  if (mapaDeListas[key] && $.inArray(value, mapaDeListas[key]) == -1) {  
     // Caso o array com o nome da key  exista e o valeu não, então, ele adicionar o value a sua respectiva key 
     mapaDeListas[key].push(value);
    }
    else {
        // Caso a condição acima seja false, então, cria-se o array de acordo com o valor da "key" e adiciona o valor de "value"
        mapaDeListas[key] = [value];
    }
}
No entanto, da maneira que meu codigo estar, mesmo que eu adicione dois valores pertencente a mesma Key, ele sempre cai no else além de sobrescrever os valores já existentes. E caso eu adicione uma Key nova em vez de ser criado um novo array o que acontece é que este novo sobrescreve o anterior.

Alguém sabe me dizer o que devo fazer para corrigir o meu código?
Desde de já obrigado pela ajuda de todos.

1 Resposta

wagnerfrancisco

Num Map em Java, se você tentar adicionar dois valores distintos para uma mesma chave, ele sobrescreve o primeiro valor na segunda adição. Para manter vários valores na mesma chave, você precisa fazer um Map onde o valor seja uma coleção. Algo do tipo:

Map<String, List<String>> meuMapa = new HashMap<String, List<String>>();
add(meuMapa, "chave", "um");
add(meuMapa, "chave", "dois");

//metodo para adicionar um valor:
public void add(Map<String, List<String>> mapa, String key, String value) {
   if (!mapa.containsKey(key)) {
      mapa.put(key, new ArrayList()); //inicializando colecao
   }
   mapa.get(key).add(value);
}

Em Javascript você faz algo semelhante:

var meuMapa = {};
add(meuMapa, "chave", "um");
add(meuMapa, "chave", "dois");

function add(mapa, key, value) {
   if (!(key in mapa)) {
      mapa[key] = []; //inicializando colecao
   }
   mapa[key].push(value);
}

Eu não testei este código, portanto podem haver erros de digitação.

Ainda, você pode criar um tipo Mapa que faça está verificação pra você (ao invés de uma function somente):

MyMap.prototype = {
   add: function(key, value) {
      if (!(key in this)) {
         this[key] = [];
      }
      this[key].push(value);
   }
};

var meuMapa = new MyMap();
meuMapa.add('chave', 'um');
meuMapa.add('chave', 'dois');
Criado 26 de janeiro de 2013
Ultima resposta 4 de fev. de 2013
Respostas 1
Participantes 2