2012-01-17 16 views
99

Digamos que usted tiene una clase javascript como estoJavascript - clasificar objetos en una matriz en orden alfabético en una propiedad de la matriz

var DepartmentFactory = function(data) { 
    this.id = data.Id; 
    this.name = data.DepartmentName; 
    this.active = data.Active; 
} 

Digamos que a continuación, crea un número de instancias de esa clase y almacenarlos en una gama

var objArray = []; 
objArray.push(DepartmentFactory({Id: 1, DepartmentName: 'Marketing', Active: true})); 
objArray.push(DepartmentFactory({Id: 2, DepartmentName: 'Sales', Active: true})); 
objArray.push(DepartmentFactory({Id: 3, DepartmentName: 'Development', Active: true})); 
objArray.push(DepartmentFactory({Id: 4, DepartmentName: 'Accounting', Active: true})); 

Así que ahora tendría una gran variedad de objetos creados por DepartmentFactory. ¿Cómo voy a utilizar el método array.sort() para ordenar esta matriz de objetos por la propiedad DepartmentName de cada objeto?

El método array.sort() funciona bien cuando se clasifica una matriz de cadenas

var myarray=["Bob", "Bully", "Amy"]; 
myarray.sort(); //Array now becomes ["Amy", "Bob", "Bully"] 

Pero, ¿cómo hacer que funcione con una lista de los objetos?

+0

Puede pasar una función de clasificación como primer argumento para .sort(). –

+2

Dado que está utilizando 'DepartmentFactory' como constructor, cree sus objetos usando' new DepartmentFactory'; de lo contrario, la matriz se rellenará con un conjunto de valores 'undefined'. – Anurag

Respuesta

169

que tendría que hacer algo como esto:

objArray.sort(function(a, b) { 
    var textA = a.DepartmentName.toUpperCase(); 
    var textB = b.DepartmentName.toUpperCase(); 
    return (textA < textB) ? -1 : (textA > textB) ? 1 : 0; 
}); 

nota: cambiar el caso (a superior o inferior) asegura un caso tipo insensible.

-1

Tienes que pasar una función que acepta dos parámetros, los compara, y devuelve un número, por lo que suponiendo que quería ordenarlos por ID que iba a escribir ...

objArray.sort(function(a,b) { 
    return a.id-b.id; 
}); 
// objArray is now sorted by Id 
+4

Preguntó acerca de ordenar por DepartmentName, no Id. –

+0

Intenté esto y esto no parece funcionar en columnas de cadena ... funcionó en una columna de fecha. Lo que funcionó fue la solución de @ omer-bokhari – tsando

82

Para soporte Unicode:

objArray.sort(function(a, b) { 
    return a.DepartmentName.localeCompare(b.DepartmentName); 
}); 
+1

Para una versión insensible a mayúsculas y minúsculas, use lo siguiente en la línea 2: 'return a.DepartmentName.toLowerCase(). LocaleCompare (b.DepartmentName.toLowerCase()); ' –

2

DEMO

var DepartmentFactory = function(data) { 
    this.id = data.Id; 
    this.name = data.DepartmentName; 
    this.active = data.Active; 
} 

var objArray = []; 
objArray.push(new DepartmentFactory({Id: 1, DepartmentName: 'Marketing', Active: true})); 
objArray.push(new DepartmentFactory({Id: 2, DepartmentName: 'Sales', Active: true})); 
objArray.push(new DepartmentFactory({Id: 3, DepartmentName: 'Development', Active: true})); 
objArray.push(new DepartmentFactory({Id: 4, DepartmentName: 'Accounting', Active: true})); 

console.log(objArray.sort(function(a, b) { return a.name > b.name})); 
+0

¿funcionará esto también para enteros? –

10
var DepartmentFactory = function(data) { 
    this.id = data.Id; 
    this.name = data.DepartmentName; 
    this.active = data.Active; 
} 

// use `new DepartmentFactory` as given below. `new` is imporatant 

var objArray = []; 
objArray.push(new DepartmentFactory({Id: 1, DepartmentName: 'Marketing', Active: true})); 
objArray.push(new DepartmentFactory({Id: 2, DepartmentName: 'Sales', Active: true})); 
objArray.push(new DepartmentFactory({Id: 3, DepartmentName: 'Development', Active: true})); 
objArray.push(new DepartmentFactory({Id: 4, DepartmentName: 'Accounting', Active: true})); 

function sortOn(property){ 
    return function(a, b){ 
     if(a[property] < b[property]){ 
      return -1; 
     }else if(a[property] > b[property]){ 
      return 1; 
     }else{ 
      return 0; 
     } 
    } 
} 

//objArray.sort(sortOn("id")); // because `this.id = data.Id;` 
objArray.sort(sortOn("name")); // because `this.name = data.DepartmentName;` 
console.log(objArray); 

demo: http://jsfiddle.net/diode/hdgeH/

0

hacerlo de esta manera

objArrayy.sort(function(a, b){ 
var nameA=a.name.toLowerCase(), nameB=b.name.toLowerCase() 
if (nameA < nameB) //sort string ascending 
    return -1 
if (nameA > nameB) 
    return 1 
return 0 //default return value (no sorting) 
}); 
console.log(objArray) 
4
// Sorts an array of objects "in place". (Meaning that the original array will be modified and nothing gets returned.) 
function sortOn (arr, prop) { 
    arr.sort (
     function (a, b) { 
      if (a[prop] < b[prop]){ 
       return -1; 
      } else if (a[prop] > b[prop]){ 
       return 1; 
      } else { 
       return 0; 
      } 
     } 
    ); 
} 

//Usage example: 

var cars = [ 
     {make:"AMC",  model:"Pacer", year:1978}, 
     {make:"Koenigsegg", model:"CCGT", year:2011}, 
     {make:"Pagani",  model:"Zonda", year:2006}, 
     ]; 

// ------- make ------- 
sortOn(cars, "make"); 
console.log(cars); 

/* OUTPUT: 
AMC   : Pacer : 1978 
Koenigsegg : CCGT : 2011 
Pagani  : Zonda : 2006 
*/ 



// ------- model ------- 
sortOn(cars, "model"); 
console.log(cars); 

/* OUTPUT: 
Koenigsegg : CCGT : 2011 
AMC   : Pacer : 1978 
Pagani  : Zonda : 2006 
*/ 



// ------- year ------- 
sortOn(cars, "year"); 
console.log(cars); 

/* OUTPUT: 
AMC   : Pacer : 1978 
Pagani  : Zonda : 2006 
Koenigsegg : CCGT : 2011 
*/ 
-4

Una respuesta sencilla:

objArray.sort(function(obj1, obj2) { 
    return obj1.DepartmentName > obj2.DepartmentName; 
}); 

ES6 manera:

objArray.sort((obj1, obj2) => {return obj1.DepartmentName > obj2.DepartmentName}; 

Si usted necesita para que sea minúsculas/mayúsculas, etc., acaba de hacer eso y tienda que da lugar a una variable que comparar esa variable. Ejemplo:

objArray.sort((obj1, obj2) => { 
    var firstObj = obj1.toLowerCase(); 
    var secondObj = obj2.toLowerCase(); 
    return firstObj.DepartmentName > secondObj.DepartmentName; 
}); 
Cuestiones relacionadas