Atravessando índices de matriz negativos em JScript
-
02-07-2019 - |
Pergunta
I têm uma matriz esparsa em JScript, com elementos não-nulos que ocorrem em ambos negativos e positivos índices. Ao tentar utilizar um no ciclo, não atravessam a matriz do índice mais baixo (negativa) para a maior índice positivo. Em vez disso, ele retorna a matriz na ordem que os elementos adicionados. não enumeração não quer trabalhar. Existe algum método que permita-me a fazer isso?
arrName = new Array();
arrName[-10] = "A";
arrName[20] = "B";
arrName[10] = "C";
Quando loop através, ele deve me dar uma, em seguida, C a B.
Solução
Tecnicamente, "A" não é na matriz em tudo desde que você não pode ter um índice negativo. É apenas um membro do objeto arrName. Se você verificar o arrName.length você vai ver que é 21 (0,1,2, ..., 20) Por que você não usar um objeto simples em vez (como uma tabela hash). Algo como isto deve funcionar:
<script type="text/javascript">
//define and initialize your object/hastable
var obj = {};
obj[20] = 'C';
obj[10] = 'B';
obj[-10] = 'A';
// get the indexes and sort them
var indexes = [];
for(var i in obj){
indexes.push(i);
}
indexes.sort(function(a,b){
return a-b;
});
// write the values to the page in index order (increasing)
for(var i=0,l=indexes.length; i<l; i++){
document.write(obj[indexes[i]] + ' ');
}
// Should print out as "A B C" to the page
</script>
Outras dicas
Você está esbarrando no limite entre Array
s e Object
s em Javascript. elementos de matriz são acedidos por ordinal, um número inteiro entre 0 e 4294967294 (máximo número inteiro de 32-bit sem sinal - 1), inclusive. As propriedades do objeto são acessados ??pelo nome. Desde -10 não é um número ordinal válido, ele é interpretado como um nome. Aqui está um exemplo simples:
var arr = new Array();
arr[0] = 'A';
arr[1] = 'B';
arr[-1] = 'C';
arr.length
O resultado é 2 -., Existem apenas dois elementos na matriz, em índices de 0 e 1