Pergunta

Como posso criar dinamicamente chaves em arrays associativos javascript?

Toda a documentação que eu encontrei até agora é atualizar chaves que já foram criados:

 arr['key'] = val;

Eu tenho uma string como esta " name = oscar "

E eu quero acabar com algo parecido com isto:

{ name: 'whatever' }

Isso é que eu dividir a string e obter o primeiro elemento, e eu quero colocar isso em um dicionário.

Código

var text = ' name = oscar '
var dict = new Array();
var keyValuePair = text.split(' = ');
dict[ keyValuePair[0] ] = 'whatever';
alert( dict ); // prints nothing.
Foi útil?

Solução

Use o primeiro exemplo. Se a chave não existir, ele será adicionado.

var a = new Array();
a['name'] = 'oscar';
alert(a['name']);

irá aparecer uma caixa de mensagem contendo 'oscar'.

Tente:

var text = 'name = oscar'
var dict = new Array()
var keyValuePair = text.replace(/ /g,'').split('=');
dict[ keyValuePair[0] ] = keyValuePair[1];
alert( dict[keyValuePair[0]] );

Outras dicas

De alguma forma, todos os exemplos, enquanto o trabalho bem, são demasiado complicada:

  • Usam new Array(), que é um exagero (e uma sobrecarga) para uma matriz associativa simples (AKA dicionário).
  • Os melhores usar new Object(). Funciona bem, mas por que tudo isso digitação extra?

Esta questão é marcado "iniciante", então vamos torná-lo simples.

A forma super-simples de usar um dicionário em JavaScript ou "Por JavaScript não tem um objeto de dicionário especial?":

// create an empty associative array (in JavaScript it is called ... Object)
var dict = {};   // huh? {} is a shortcut for "new Object()"

// add a key named fred with value 42
dict.fred = 42;  // we can do that because "fred" is a constant
                 // and conforms to id rules

// add a key named 2bob2 with value "twins!"
dict["2bob2"] = "twins!";  // we use the subscript notation because
                           // the key is arbitrary (not id)

// add an arbitrary dynamic key with a dynamic value
var key = ..., // insanely complex calculations for the key
    val = ...; // insanely complex calculations for the value
dict[key] = val;

// read value of "fred"
val = dict.fred;

// read value of 2bob2
val = dict["2bob2"];

// read value of our cool secret key
val = dict[key];

Agora, alterar valores de deixá:

// change the value of fred
dict.fred = "astra";
// the assignment creates and/or replaces key-value pairs

// change value of 2bob2
dict["2bob2"] = [1, 2, 3];  // any legal value can be used

// change value of our secret key
dict[key] = undefined;
// contrary to popular beliefs assigning "undefined" does not remove the key

// go over all keys and values in our dictionary
for (key in dict) {
  // for-in loop goes over all properties including inherited properties
  // let's use only our own properties
  if (dict.hasOwnProperty(key)) {
    console.log("key = " + key + ", value = " + dict[key]);
  }
}

A exclusão de valores também é fácil:

// let's delete fred
delete dict.fred;
// fred is removed, the rest is still intact

// let's delete 2bob2
delete dict["2bob2"];

// let's delete our secret key
delete dict[key];

// now dict is empty

// let's replace it, recreating all original data
dict = {
  fred:    42,
  "2bob2": "twins!"
  // we can't add the original secret key because it was dynamic,
  // we can only add static keys
  // ...
  // oh well
  temp1:   val
};
// let's rename temp1 into our secret key:
if (key != "temp1") {
  dict[key] = dict.temp1; // copy the value
  delete dict.temp1;      // kill the old key
} else {
  // do nothing, we are good ;-)
}

Javascript não tem associativa matrizes , tem objetos .

As seguintes linhas de código todos fazem exatamente a mesma coisa -. Defina o campo 'nome' em um objeto para 'Orion'

var f = new Object(); f.name = 'orion';
var f = new Object(); f['name'] = 'orion';
var f = new Array(); f.name = 'orion';
var f = new Array(); f['name'] = 'orion';
var f = new XMLHttpRequest(); f['name'] = 'orion';

Parece que você tem uma matriz associativa porque um Array é também um Object -. No entanto você não está realmente adicionando coisas para a matriz em tudo, você está campos de definições sobre o objeto

Agora que isso está esclarecido, aqui é uma solução de trabalho para o seu exemplo

var text = '{ name = oscar }'
var dict = new Object();

// Remove {} and spaces
var cleaned = text.replace(/[{} ]/g, '');

// split into key and value
var kvp = cleaned.split('=');

// put in the object
dict[ kvp[0] ] = kvp[1];
alert( dict.name ); // prints oscar.

Em resposta a MK_Dev, um é capaz de iterate, mas não consecutivamente. (Por que, obviamente, uma matriz é necessária)

Quick google search traz tabelas hash em javascript

código Exemplo para um loop sobre os valores em um hash (de ligação acima mencionado):

var myArray = new Array();
myArray['one'] = 1;
myArray['two'] = 2;
myArray['three'] = 3;

// show the values stored
for (var i in myArray) {
    alert('key is: ' + i + ', value is: ' + myArray[i]);
}

Código Original (Eu adicionei os números das linhas assim que pode se referir a eles):

1  var text = ' name = oscar '
2  var dict = new Array();
3  var keyValuePair = text.split(' = ');
4  dict[ keyValuePair[0] ] = 'whatever';
5  alert( dict ); // prints nothing.

Quase lá ...

  • Linha 1:. Você deve fazer uma trim no texto assim que é name = oscar
  • linha 3: tudo bem, desde que você sempre tem espaços em torno de seu igual. talvez seja melhor não trim na linha 1, o uso = e aparar cada KeyValuePair
  • adicionar uma linha depois de 3 e antes de 4:

    key = keyValuePair[0];`
    
  • Linha 4: Agora torna-se:

    dict[key] = keyValuePair[1];
    
  • linha 5: Change to:

    alert( dict['name'] );  // it will print out 'oscar'
    

O que eu estou tentando dizer é que o dict[keyValuePair[0]] não funcionar, você precisa definir uma string para keyValuePair[0] e usar isso como a chave associativa. Essa é a única maneira que eu tenho o meu ao trabalho. Depois de ter configurá-lo você pode se referir a ele com o índice numérico ou chave entre aspas.

Espero que ajude.

Todos os navegadores modernos suportam um Mapa , que é um estreitamento de dados chave / valor. Há um par de razões que tornam usando um mapa melhor do objeto:

  • Um objeto tem um protótipo, por isso há teclas padrão do mapa.
  • As chaves de um objeto são Cordas, onde eles podem ser qualquer valor para um mapa.
  • Você pode obter o tamanho de um mapa facilmente, enquanto você tem que manter o controle de tamanho de um objeto.

Exemplo:

var myMap = new Map();

var keyObj = {},
    keyFunc = function () {},
    keyString = "a string";

myMap.set(keyString, "value associated with 'a string'");
myMap.set(keyObj, "value associated with keyObj");
myMap.set(keyFunc, "value associated with keyFunc");

myMap.size; // 3

myMap.get(keyString);    // "value associated with 'a string'"
myMap.get(keyObj);       // "value associated with keyObj"
myMap.get(keyFunc);      // "value associated with keyFunc"

Se você quiser as chaves que não são referenciados de outros objetos para ser lixo coletado, considere usar um WeakMap em vez de um mapa.

Eu acho que é melhor se você acabou de criar como este

var arr = [];

arr = {
   key1: 'value1',
   key2:'value2'
};

para mais informações, dê uma olhada nesta

Estruturas de Dados JavaScript - matriz associativa

var myArray = new Array();
myArray['one'] = 1;
myArray['two'] = 2;
myArray['three'] = 3;
// show the values stored
for (var i in myArray) {
    alert('key is: ' + i + ', value is: ' + myArray[i]);
}

este é ok, mas itera através de cada propriedade do objeto array. se você quiser apenas para percorrer os myArray.one propriedades, myArray.two ... você tentar como este

myArray['one'] = 1;
myArray['two'] = 2;
myArray['three'] = 3;
myArray.push("one");
myArray.push("two");
myArray.push("three");
for(i=0;i<maArray.length;i++{
    console.log(myArray[myArray[i]])
}

Agora você pode acessar tanto por myArray [ "um"] e repita somente através dessas propriedades.

var obj = {};

                for (i = 0; i < data.length; i++) {
                    if(i%2==0) {
                        var left = data[i].substring(data[i].indexOf('.') + 1);
                        var right = data[i + 1].substring(data[i + 1].indexOf('.') + 1);

                        obj[left] = right;
                        count++;
                    }
                }
                console.log("obj");
                console.log(obj);
                // show the values stored
                for (var i in obj) {
                    console.log('key is: ' + i + ', value is: ' + obj[i]);
                }

            }
        };

}

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top