Matrizes associativas multidimensionais em JavaScript

Existem os seguintes resultados da consulta: (key1 e key2 podem ser qualquer texto)

id key1 key2 value 1 fred apple 2 2 mary orange 10 3 fred banana 7 4 fred orange 4 5 sarah melon 5 ... 

e desejo armazenar os dados em uma grade (talvez como uma matriz) fazendo o loop de todos os registros da seguinte forma:

  apple orange banana melon fred 2 4 7 - mary - 10 - - sarah - - - 5 

No PHP isso seria muito fácil, usando matrizes associativas:

 $result['fred']['apple'] = 2; 

Mas em matrizes associativas JavaScript como esta não funciona. Depois de ler toneladas de tutorial, tudo que consegui foi o seguinte:

 arr=[]; arr[1]['apple'] = 2; 

mas arr['fred']['apple'] = 2; não funciona. Eu tentei matrizes de objects, mas as propriedades dos objects não podem ser texto livre. Quanto mais eu estava lendo tutoriais, mais eu ficava confuso …

Qualquer ideia é bem vinda 🙂

Basta usar um object JavaScript regular, que seria “lido” da mesma maneira que as matrizes associativas. Você precisa se lembrar de inicializá-los primeiro também.

 var obj = {}; obj['fred'] = {}; if('fred' in obj ){ } // can check for the presence of 'fred' if(obj.fred) { } // also checks for presence of 'fred' if(obj['fred']) { } // also checks for presence of 'fred' // The following statements would all work obj['fred']['apples'] = 1; obj.fred.apples = 1; obj['fred'].apples = 1; // or build or initialize the structure outright var obj = { fred: { apples: 1, oranges: 2 }, alice: { lemons: 1 } }; 

Se você está procurando por valores, você pode ter algo parecido com isto:

 var people = ['fred', 'alice']; var fruit = ['apples', 'lemons']; var grid = {}; for(var i = 0; i < people.length; i++){ var name = people[i]; if(name in grid == false){ grid[name] = {}; // must initialize the sub-object, otherwise will get 'undefined' errors } for(var j = 0; j < fruit.length; j++){ var fruitName = fruit[j]; grid[name][fruitName] = 0; } } 

Se não precisa ser um array, você pode criar um object JS “multidimensional” …

  

Javascript é flexível:

 var arr = { "fred": {"apple": 2, "orange": 4}, "mary": {} //etc, etc }; alert(arr.fred.orange); alert(arr["fred"]["orange"]); for (key in arr.fred) alert(key + ": " + arr.fred[key]); 

como eu precisava de todos os elementos de uma maneira legal, encontrei este assunto. atravessando array / object associativo bidimensional – não importa o nome para mim, porque a funcionalidade conta

  var imgs_pl= {'offer':{'img':'wer-handwritter_03.png','left': 1,'top': 2 }, 'portfolio':{'img':'wer-handwritter_10.png','left': 1,'top': 2 }, 'special':{'img':'wer-handwritter_15.png','left': 1,'top': 2 } }; for (key in imgs_pl){ console.log(key); for (subkey in imgs_pl[key]){ console.log(imgs_pl[key][subkey]); }//for }//for 

Não use uma matriz, use um object.

  var foo = new Object(); 

Obtenha o valor para uma matriz da propriedade de matrizes associativas quando o nome da propriedade for um inteiro:

Começando com uma Matriz Associativa, onde os nomes das propriedades são inteiros:

 var categories = [ {"1":"Category 1"}, {"2":"Category 2"}, {"3":"Category 3"}, {"4":"Category 4"} ]; 

Envie itens para o array:

 categories.push({"2300": "Category 2300"}); categories.push({"2301": "Category 2301"}); 

Faça um loop por array e faça algo com o valor da propriedade.

 for (var i = 0; i < categories.length; i++) { for (var categoryid in categories[i]) { var category = categories[i][categoryid]; // log progress to the console console.log(categoryid + " : " + category); // ... do something } } 

A saída do console deve ficar assim:

 1 : Category 1 2 : Category 2 3 : Category 3 4 : Category 4 2300 : Category 2300 2301 : Category 2301 

Como você pode ver, você pode contornar a limitação da matriz associativa e ter um nome de propriedade como um inteiro.

NOTA: O array associativo no meu exemplo é o json que você teria se você serializasse um object Dictionary [].

Parece que, para algumas aplicações, existe uma abordagem muito mais simples para matrizes associativas multidimensionais em javascript.

1) Dado que a representação interna de todas as matrizes são realmente objects de objects, foi demonstrado que o tempo de access para elementos indexados numericamente é, na verdade, o mesmo que para elementos indexados associativos (texto).

2) o tempo de access para elementos indexados associativos de primeiro nível não aumenta à medida que o número de elementos reais aumenta.

Sendo assim, pode haver muitos casos em que é realmente melhor usar uma abordagem de string concatenada para criar a equivalência de elementos multidimensionais. Por exemplo:

 store['fruit']['apples']['granny']['price] = 10 store['cereal']['natural']['oats']['quack'] = 20 

vai para:

 store['fruit.apples.granny.price'] = 10 store['cereal.natural.oats.quack'] = 20 

As vantagens incluem:

  • não há necessidade de inicializar sub-objects ou descobrir a melhor forma de combinar objects
  • tempo de access de nível único. objects dentro de objects precisam de N vezes o tempo de access
  • pode usar Object.keys () para extrair todas as informações de dimensão e ..
  • pode usar a function regex.test (string) e a function array.map nas teclas para extrair exatamente o que você deseja.
  • sem hierarquia nas dimensões.
  • o “ponto” é arbitrário – usar sublinhado na verdade torna o regex mais fácil
  • há muitos scripts para “achatar” o JSON dentro e fora desse formato também
  • pode usar todas as outras funções agradáveis ​​de processamento de matriz na lista principal
  

Você não precisa necessariamente usar objects, você pode fazê-lo com matrizes multidimensionais normais.

Esta é a minha solução sem objects :

 // Javascript const matrix = []; matrix.key1 = [ 'value1', 'value2', ]; matrix.key2 = [ 'value3', ]; 

que no PHP é equivalente a:

 // PHP $matrix = [ "key1" => [ 'value1', 'value2', ], "key2" => [ 'value3', ] ]; 
Intereting Posts