2012-01-17 23 views
99

比方说,你有这样的的Javascript - 按照对象的数组按字母顺序对数组的一个属性

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

一个JavaScript类比方说,然后创建一个数字,类的实例,并将其存储在一个阵列

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})); 

所以我现在不得不通过创建DepartmentFactory对象的数组。我将如何使用array.sort()方法通过每个对象的DepartmentName属性对这个对象数组进行排序?

array.sort()方法字符串进行排序

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

数组时,但我怎么使它与对象的列表上班工作得很好?

+0

您可以将一个排序函数作为第一个参数传递给.sort()。 –

+2

由于您使用'DepartmentFactory'作为构造函数,因此使用'new DepartmentFactory'创建它的对象,否则数组将被填充一大堆'undefined'值。 – Anurag

回答

169

你会做如下所示:

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

注意:更改大小写(大写或小写)可确保不区分大小写。

-1

你要通过这两个参数,对它们进行比较,并返回一个数的函数,所以假设你希望通过你会写ID对它们进行排序...

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

他询问有关DepartmentName排序的问题,而不是Id。 –

+0

我试过了,这似乎不适用于字符串列......它在日期列上工作。有效的解决方案来自@ omer-bokhari – tsando

82

为支持Unicode:

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

对于不区分大小写的版本,请在第二行使用以下内容: '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

这个工作对于整数是否也一样? –

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); 

演示:http://jsfiddle.net/diode/hdgeH/

0

做这样的

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

一个简单的回答:

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

ES6方式:

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

如果你需要使它小写/大写等,只要做到这一点,商店,导致可变比比较那个变量。示例:

objArray.sort((obj1, obj2) => { 
    var firstObj = obj1.toLowerCase(); 
    var secondObj = obj2.toLowerCase(); 
    return firstObj.DepartmentName > secondObj.DepartmentName; 
}); 
相关问题