Tomando
nosso primeiro exemplo do artigo anterior, a Array macarrao,
suponhamos que quiséssemos ordenar os elementos dela em ordem
alfabética? Fácil - só precisamos usar o método
de classificar Array (sorting):
Não
é exatamente o que tínhamos em mente. Isto é porque
o método de classificação padrão sempre
aplica uma classificação alfabética sobre os elementos
da array sem prestar atenção nos valores atuais dos números
(usando, ao invés, o valor ASCII do primeiro número na
classificação). Para obter uma ordenação
numérica, vamos precisar de uma função personalizada
de classificação, que dirá ao método de
classificação como ordenar os elementos. Eis aqui um exemplo
corretamente funcional do que nós queríamos:
function
sortByNumber(a, b) {
return (a > b);
}
ages = [13, 52, 33, 2, 25, 14, 3, 77, 8];
ages.sort(sortByNumber);
trace(ages);
saída
--> 2,3,8,13,14,25,33,52,77
Muito
melhor (mas não me pergunte como funciona. Você pode dar
uma olhada no arquivo de ajuda para obter mais algumas explicações,
e tenha em mente que "a" e "b" são números,
assim, estamos basicamente dizendo "compare o valor numérico
dos elementos quando classificar.")
Arrays
Multidimensionais
Uma
Array multidimensional em Flash é simplesmente uma array que
contém outra array (ou muitas outras arrays). Um modo para criar
uma dessas é simplesmente nomear todos os elementos, como fizemos
anteriormente, assim:
Assim,
em outras palavras, é uma array chamada "foods", que
contém 3 elementos. Cada elemento é sua própria
array - de macarrao, frutas e vegetais, no caso
disso não ser óbvio. Então, por exemplo, para acessar
o primeiro elemento (maçãs) da segunda array (["maçãs","laranjas"]),
precisaremos usar dois índices da array para apontá-lo:
trace("O
primeiro elemento da segunda array é " + foods[1][0]);
saída
--> O primeiro elemento da segunda array é "maçãs"
O
que dizemos lá? Dizemos, "Veja no segundo elemento de "foods"
(foods[1]) e encontre o primeiro elemento daquela array (foods[1][0])
e diga-nos o que ele é". Um modo mais elaborado para fazer
isso seria separar o segundo elemento como uma variável e achar
seu 1º elemento:
secondElem
= foods[1];
trace("O item que estou selecionando é " + secondElem[0]);
saída --> O item que estou selecionando é "maçãs".
Viu
como é a mesma coisa? Se não, tente colar o código
e brincar por aí com diferentes combinações até
que a coisa faça sentido.
Classificar
uma array multidimensional
Agora
que podemos classificar arrays alfa-numericamente, ou por valores numéricos
e criar arrays multidimensionais, vamos combiná-las todas dentro
do exemplo visto acima: uma array multidimensional que é mostrada
para o usuário numa série de campos de texto. Baixe
aqui o exemplo.
Em
primeiro lugar, nós criamos e nomeamos os campos de texto de
tal modo que eles possam ser facilmente acessados em círculos.
Isto é, os nomes devem ser uma combinação de uma
string identificadora, mais um número. Os campos de texto para
a primeira coluna, firstName, são nomeados assim: firstName0,
firstName1, firstName2, firstName3, e firstName4.
Desse modo, nós, ou podemos recorrer ao campo de texto por seu
nome, firstName0, ou por seu associativo-array-equivalente, esse ["firstName"+0]
(Para mais informações sobre como endereçar objetos
em Flash como esse, veja o artigo Objeto movieclip - endereçamento
nessa mesma seção, o qual se aplica a todos os objetos
- não somente aos movieclips - em Flash, incluindo variáveis
e funções).
Em
seguida criamos o conteúdo da array (ou o lemos a partir de um
arquivo de texto externo), com essa instrução:
//
depois do passo a seguir, subentries será uma array de
strings
subentries = mydata.split(",");
//
depois do loop a seguir, entries será uma array de arrays
-- o que nós queremos
for (i in subentries) {
entries.push(subentries[i].split(":"));
}
(mas
não precisamos fazer isso no exemplo acima - isto é só
uma nota para qualquer um que deseje obter leitura de dados externa
dentro de uma array Flash). Depois que nós tivermos o conteúdo
de entradas da array, faremos uma função que preencherá
nossos campos de texto com o conteúdo atual daquela array. Porque
os nomeamos para fácil acessibilidade, podemos utilizar essa
função para carregar os campos de texto:
e
então chamar a função mostrar para mostrar outra
vez os campos de texto sempre que o conteúdo da array mudar (i.e.,
depois de uma ordenação).
O
passo final é para definir cada uma das funções
de classificação e aplicar aquela apropriada para cada
botão de classificação. Cada função
de classificação fará com que toda a array seja
ordenada baseada no conteúdo de um sub-elemento particular da
array. Por exemplo, a função que classifica por estado
(o 4o sub-elemento no interior de cada array, apontado pelo indicador
3) parecerá assim:
function
byState (a, b) {
return a[3]>b[3];
}
e
ela é aplicada ao botão "sort by state" como
isso:
on
(release) {
entries.sort(byState);
display();
}
Isso
manda classificar todas as entradas da array baseado no valor do 4o
elemento (state) de cada sub-array. (Obrigado a Fumio Nonaka
e Tatsuo Kato por apontar este método de classificação
na lista de codificadores de Flash) Uma função e um código
similares são aplicados para cada um dos botões de classificação.
Dê uma olhada no código fonte do fla para ver como a coisa
toda trabalha.
Devido à reformulação implementada no site, pode ser que você encontre alguns links quebrados. Por favor, ajude-nos a corrigir eventuais problemas nos informando links quebrados
2 comentários
Comentário de Marco | 23/5/2012 - 16:58 |
minha array tem
nome, indice
Marco, 10
Joao, 1
Renato, 4
preciso que retorne classificado pelo indice
Joao, 1
Renato, 4
Marco, 10
nao consigo.
Comentário de leonardo | 31/3/2010 - 14:20 |
O que seria childnode, e pra que serve as letras, ex:
ii
i+
i++
j
etc..