Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Cleiton Pereira

[Resolvido] relação a ordenação da matrizes

Recommended Posts

Olá companheiros do iMasters, estou com uma dúvida em relação a ordenação de vetores e andei pesquisando mas não encontrei nenhum material que pudesse resolver meu problema.

 

 

Resumidamente, eu tenho uma aplicação que armazena Nome, Idade e Cidade, cada um desses elementos em uma camada da minha matriz.

 

 

Por exemplo:

 

var cliente = new Array();

   cliente = [
          ["Algusto", "25", "São Paulo"],
	  ["Zacaria", "19", "Rio de Janeiro"],
	  ["Alfredo", "30", "Belém"]
       ];

 

Como eu faria para ordenar essa matriz por Nome, por idade e por cidade.

Gostaria de saber as 3 maneiras pois tenho 3 funções que executariam essas ordenações.

 

Se houver um meio mais viável de fazer isso por favor me avisem.

 

 

 

Obs.:Li sobre a tecnica bubble sort mas ela não ficou muito clara para mim, se alguém puder me explicar.

 

Grato!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá novamente, andei procurando por soluções na Web e me deparei com o uso de um Array de Objetos e um exemplo funcionou da maneira que eu precisava, no entanto não estou conseguindo imprimir os valores do meu Array no meu documento html nem com alert, tão pouco com document.write, pois os dois me retornam apenas isto:

 

[object Object],[object Object],[object Object]

 

onde ele deveria estar me informando os campos

 

Nome, idade, cidade

 

 

Segue o código modificado de feito pelo autor Gustavo Paes:

 

 

<!DOCTYPE HTML>

<html lang="pt-BR">

<head>
<meta charset="ISO-8859-1">
<title>Ordenação de Arrays</title>

<script type="text/javascript">
	var pessoas = [
		{
			"nome": "Pedro",
			"idade": 18,
			"cidade": "São Paulo"
		},

		{
			"nome": "Carlos",
			"idade": 25,
			"cidade": "Barueri"
		},

		{
			"nome": "Ana",
			"idade": 21,
			"cidade": "Santos"
		}
	];

	// Ordena pelo nome do usuário
	function ---ome(pessoas1, pessoas2) {
		return pessoas1.nome > pessoas2.nome;
	}

	// Ordena pela cidade do usuário
	function porCidade(pessoas1, pessoas2) {
		return pessoas1.cidade > pessoas2.cidade;
	}

	// Ordena pela idade do usuário
	function porIdade(pessoas1, pessoas2) {
		return pessoas1.idade > pessoas2.idade;
	}

	console.dir(pessoas);
	console.dir(pessoas.sort(---ome));
	console.dir(pessoas.sort(porCidade));
	console.dir(pessoas.sort(porIdade));
</script>
</head>

<body>

</body>

</html>

 

 

Obs.:Funciona perfeitamente no console do firebug.

 

Obs².:Alterei o comando console.dir() tanto para alert() como para document.write(), mas nenhum dos dois me retornaram um valor mas sim que se tratava de um objeto, como expliquei no inicio da postagem

 

 

Alguém?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ordenando por idade:

 

cliente.sort(function(x, y) {
return parseInt(x[1])-parseInt(y[1]);
});

 

Como você está armazenando os números como strings, usei parseInt(). Para ordenar pelos outros valores (nome, cidade) você fará a mesma coisa, apenas ajustará os índices e não precisará usar parseInt.

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é João, consegui ordenar os valores com um Array de Objetos como citei em uma postagem anterior a sua, mas agora não estou conseguindo imprimi-los.

 

 

Quando tento imprimir todos de uma vez desta maneira:

 

 

alert(pessoas);

 

me é retornado isso:

 

[object Object],[object Object],[object Object]

 

 

 

E quando tento acessar apenas um atributo desta forma:

 

alert(pessoas.nome);

 

me é retornado

 

undefined

 

 

E mesmo se funcionasse desta segunda maneira, acredito que não seriam retornados todos os valores da propriedade nome. Como devo proceder?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá,

 

Primeiro, para debugar sempre utilize o console.log e não o alert, pois o alert não te dá muita info à respeito de object.

 

O seu código:

 

alert(pessoas.nome);

 

dá "undefined" pois pessoas é o Array e não possui a propriedade "nome". Quem tem a propriedade nome é o objeto que está em cada posição do Array. Experimente:

 

alert(pessoas[0].nome);

 

Ou ainda:

 

for (var i = 0, j = pessoas.length; i < j; i++) {
   alert(pessoas[i].nome);
}

 

Obs.: Códigos não testados mas creio que funcione.

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Problema resolvido.

 

Quebrei a cabeça um tempinho mas encontrei o que procurava. O método sort() deve ter uma função customizada passando como parâmetro(ou será argumento?não sei) duas variaveis, a e b. Para ordenar a matriz atribuí a essas variáveis, que vão ter valores definidos pelo próprio método posteriormente, os índices que eu queria que fossem fazer a ordenação do meu Array.

 

Bom, acredito que o exemplo fala por si só.

 

 

<!DOCTYPE HTML>

<html lang="pt-BR">

<head>
<meta charset="ISO-8859-1">
<title></title>

<script type="text/javascript">

	var pessoas = 	[
						["Pedro", 25, "M"],
						["Paulo", 15, "M"],
						["Maria", 20, "F"],
						["Carlo", 21, "M"]
					];

	for (var i = 0; i < pessoas.length; i++)
	{
		document.write("<b>Nome:</b> " + pessoas[i][0]   + "<br>");
		document.write("<b>Idade:</b> " + pessoas[i][1]  + "<br>");
		document.write("<b>Sexo:</b> " + pessoas[i][2]   + "<br>");
		document.write("<br>");
	}

	document.write("<hr>");/* ************************************************************* */

	//Ordenação por nome
	pessoas.sort(function(a,B) 
	{		
		a = a[0];	//[0] representa o indice ocupado pelos nomes na matriz
		b = b[0];

		return a == b ? 0 : (a < b ? -1 : 1);		
	});

	document.write("<hr>");/* ************************************************************* */

	for (var i = 0; i < pessoas.length; i++)
	{
		document.write("<b>Nome:</b> " + pessoas[i][0]   + "<br>");
		document.write("<b>Idade:</b> " + pessoas[i][1]  + "<br>");
		document.write("<b>Sexo:</b> " + pessoas[i][2]   + "<br>");
		document.write("<br>")
	}

	document.write("<hr>");/* ************************************************************* */

	//Ordenação por idade
	pessoas.sort(function(a,B) 
	{		
		a = a[1];	//[1] representa o indice ocupado pelas idades na matriz
		b = b[1];

		return a == b ? 0 : (a < b ? -1 : 1);		
	});

	document.write("<hr>");/* ************************************************************* */

	for (var i = 0; i < pessoas.length; i++)
	{
		document.write("<b>Nome:</b> " + pessoas[i][0]   + "<br>");
		document.write("<b>Idade:</b> " + pessoas[i][1]  + "<br>");
		document.write("<b>Sexo:</b> " + pessoas[i][2]   + "<br>");
		document.write("<br>")
	}

	document.write("<hr>");/* ************************************************************* */

	//Ordenação por sexo
	pessoas.sort(function(a,B) 
	{		
		a = a[2];	//[2] representa o indice ocupado pelos sexos na matriz
		b = b[2];

		return a == b ? 0 : (a < b ? -1 : 1);		
	});

	document.write("<hr>");/* ************************************************************* */

	for (var i = 0; i < pessoas.length; i++)
	{
		document.write("<b>Nome:</b> " + pessoas[i][0]   + "<br>");
		document.write("<b>Idade:</b> " + pessoas[i][1]  + "<br>");
		document.write("<b>Sexo:</b> " + pessoas[i][2]   + "<br>");
		document.write("<br>")
	}

</script>
</head>

<body>

</body>

</html>

 

Consegui fazer somente por ter a ajuda dos que colaboraram no tópico e principalmente pela excelente postagem do autor Grumelo, do site grumelo.com

 

[url="http://www.grumelo.com/2009/02/12/sorting-multi-dimensional-javascript-arrays/'>Clique aqui

 

Obrigado a todos! menos ao moderador que retirou a palavra dúvida do topico e o tornou-o incoerente...

 

 

Obs.:A Ferramenta link não está funcionando.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.