2012-01-17 1 views
99

Допустим, у вас есть яваскрипта класс, как этотJavascript - сортировать объекты в массив в алфавитном порядке по одному свойству массива

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

Допустим, вы затем создать несколько экземпляров этого класса и хранить их в массив

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

Вы должны передать функцию, которая принимает два параметра, сравнивает их и возвращает число, так что если вы хотите отсортировать их по идентификатору можно было бы написать ...

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

Он спрашивал о сортировке по имени отдела, а не по идентификатору. –

+0

Я пробовал это, и это, похоже, не работает на строковых столбцах ... он работал на столбце даты. То, что работало, было решением от @ omer-bokhari – tsando

82

Для поддержки юникода:

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

Для версии без учета регистра используйте следующую строку в строке 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

будет ли это работать так же и для целых чисел? –

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; 
}); 
Смежные вопросы