2012-01-17 28 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; 
}); 
相關問題