Como ordenar array formado por objetos usando .sort()

publicado por: Anonymous

Tengo un fichero que contiene el objeto que quiero manipular. Creo dos por ejemplo. Pero cuando en la funcion de mostrarArrayOrdenado() le aplico el sort() para ordenarlo, al tratarse de objetos y no de literales. no me ordena. Mi idea es que se ordenen por el parametro nombre de cada objeto que compone el array. ¿Es posible?

_x000D_

_x000D_

function Sandskill(nom, edad, especialidad, comp) {_x000D_
  this.nombre = nom;_x000D_
  this.edad = edad;_x000D_
  if (especialidad == 1 || especialidad == 2 || especialidad == 3) {_x000D_
    if (especialidad == 1)_x000D_
      this.especialidad = "sistemas";_x000D_
    if (especialidad == 2)_x000D_
      this.especialidad = "web";_x000D_
    if (especialidad == 3)_x000D_
      this.especialidad = "multiplataforma";_x000D_
  } else {_x000D_
    this.especialidad = null;_x000D_
  }_x000D_
  this.comp = comp;_x000D_
_x000D_
  //GETTER_x000D_
  this.getNom = function() {_x000D_
    return this.nombre;_x000D_
  }_x000D_
  this.getEdad = function() {_x000D_
    return this.edad;_x000D_
  }_x000D_
  this.getEspecialidad = function() {_x000D_
    return this.especialidad;_x000D_
  }_x000D_
  this.getComp = function() {_x000D_
    return this.comp;_x000D_
  }_x000D_
}_x000D_
_x000D_
var s1 = new Sandskill("Pepe", "22", "1");_x000D_
var s2 = new Sandskill("Juan", "22", "2", s1);_x000D_
_x000D_
function mostrarArrayOrdenado() {_x000D_
  sandskillArray.sort();_x000D_
  for (i = 0; i < sandskillArray.length; i++) {_x000D_
    alert(sandskillArray[i].getNom() + " * " + sandskillArray[i].getEdad() + " * " + sandskillArray[i].getEspecialidad() + " * ")_x000D_
  }_x000D_
}

_x000D_

_x000D_

_x000D_

solución

El método sort(), como puedes ver en la web de MDN, puede recibir como parámetro una función de comparadora que tiene la siguiente forma:

function compare(a, b) {
  if (a es menor que b según criterio de ordenamiento) {
    return -1;
  }
  if (a es mayor que b según criterio de ordenamiento) {
    return 1;
  }
  // a debe ser igual b
  return 0;
}

En tu caso, podría ser algo así como:

sandskillArray.sort(function (o1,o2) {
  if (o1.nombre > o2.nombre) { //comparación lexicogŕafica
    return 1;
  } else if (o1.nombre < o2.nombre) {
    return -1;
  } 
  return 0;
});
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *