Olá, pessoal!
Quando não se conhece muito bem como o JavaScript trabalha com seus Arrays e Objetos é possível que acabemos tendo resultados incoerentes em nossa aplicação.
A primeira coisa a se saber é que o Array no JavaScript é um tipo especial de Objeto. Um objeto que trabalha apenas com índices numéricos.
Sendo assim, vejamos alguns exemplos simples de comportamentos inesperados:
Quando estamos a instanciar um Array vazio:
var quantidades = new Array();
var quantidades = [];
Ambas criarão um Array vazio, porém a melhor forma é a segunda. Veremos logo adiante porquê.
Vamos indicar algumas quantidades para o Array:
var quantidades = new Array(50, 80);
var quantidades = [50, 80];
Também ambas criarão um Array com dois itens. A melhor forma continua sendo a a segunda.
Digamos que por algum motivo você terá apenas um item para o Array:
var quantidades = new Array(80);
var quantidades = [80];
A primeira forma criará um Array com oitenta índices indefinidos, enquanto a segunda criará um Array com um único índice armazenando a quantidade oitenta.
Vamos agora ver o que ocorre quando trabalhamos com índices associativos:
var cars = [];
cars['cor'] = 'vermelho';
cars['marca'] = 'Ferrari';
cars['potencia']= '700';
cars['blindado']= false;
cars['aro'] = 21;
Veja o que acontece caso queiramos retornar dados do array:
var total = cars.length; //retornará ZERO
var ultimo_val = cars[cars.length];//retornará undefined
var potencia = cars[2]; //retornará undefined
Afinal, como utilizar um Array associativo?
A melhor forma é aceitar que índices associativos (ou nomeados) apenas podem trabalhar em forma de Objeto:
var cars = {};
cars.cor = 'vermelho';
cars.marca = 'Ferrari';
cars.potencia = '700';
cars.blindado = false;
cars.aro = 21;
var cars = {
cor : 'vermelho',
marca : 'Ferrari',
potencia: '700',
blindado: false,
aro : 21
};
Ambos exemplos acima funcionarão corretamente! Vejamos:
var cor = cars.cor; //Retornará vermelho
var marca = cars['marca'];//sim, dessa forma retornará Ferrari corretamente
var qtd = cars.length; //Retornará undefined pois é diretamente implícito que o objeto tem apenas uma dimensão de dados
Agora, dentro destas regras acima, como criar um Array Multidimensional?
Basta acolhermos nossos Objetos dentro de um Array comum:
var cars = [
{
cor : 'vermelho',
marca : 'Ferrari',
potencia: '700',
blindado: false,
aro : 21
},
{
cor : 'azul',
marca : 'Dodge',
potencia: '700',
blindado: false,
aro : 22
}
];
As informações do Objeto acima podem ser acessadas da seguinte forma:
var cor_ferrari = cars[0].cor; //Retornará vermelho
var cor_dodge = cars[1].cor; //Retornará azul
var aro_ferrari = cars[0]['aro'];//sim, dessa forma retornará 21 corretamente
var aro_dodge = cars[1]['aro'];//sim, dessa forma retornará 22 corretamente
var qtd = cars.length; //Retornará dois
Esta mesma estrutura também pode ser feita com Arrays numéricos! Vejamos:
var z = [ [0,1,2], ['ser',7,'programador'], [34,56,78] ];
As informações do Objeto acima podem ser acessadas da seguinte forma:
var qtd_total = z.length; //Retornará três
var qtd_um = z[0].length; //Retornará três
var site = z[1][0]+z[1][2]+'.com.br'; //Retornará serprogramador.com.br
Você também pode trabalhar - se cabe à sua aplicação trabalhar dessa forma - com um único Objeto Multidimensional:
var cars = {
enzo : {
cor : 'vermelho',
marca : 'Ferrari',
potencia: '700',
blindado: false,
aro : 21
},
viper : {
cor : 'azul',
marca : 'Dodge',
potencia: '700',
blindado: false,
aro : 22
}
};
Sendo assim você acessa as informações como segue:
var qtd_total = z.length; //Retornará undefined pois estamos trabalhando com um único Objeto multidimensional
var qtd_enzo = z.enzo.length //Retornará undefined da mesma forma
var data_enzo = z[0] //Retornará undefined
var cor_enzo = z[0].cor //Retornará erro pois tenta acessar propriedade "cor" de objeto indefinido
var cor_enzo = z.enzo.cor; //Retornará vermelho
var cor_viper = z.viper.cor; //Retornará azul
