Сортировка массива JavaScript объектов на основе одного из свойств объекта

У меня есть массив объектов, каждый из которых имеет свойство name, строку. Я хотел бы отсортировать массив по этому свойству. Я бы хотел, чтобы они отсортировались следующим образом.

`ABC`
`abc`
`BAC`
`bac`
etc...

Как я могу достичь этого в JavaScript?

Ответ 1

Существует два основных способа:

var arr = [{name:"ABC"},{name:"BAC"},{name:"abc"},{name:"bac"}];

arr.sort(function(a,b){
  var alc = a.name.toLowerCase(), blc = b.name.toLowerCase();
  return alc > blc ? 1 : alc < blc ? -1 : 0;
 });

или

arr.sort(function(a,b){
  return a.name.toLowerCase().localeCompare(b.name.toLowerCase());
 });

Помните, что вторая версия игнорирует диакритические знаки, поэтому a и à будут отсортированы как одна и та же буква.

Теперь проблема с обоими этими способами заключается в том, что они не будут сортировать верхний регистр ABC до нижнего регистра ABC, так как он будет относиться к ним как к одному.

Чтобы исправить это, вам нужно будет сделать это следующим образом:

arr.sort(function(a,b){
  var alc = a.name.toLowerCase(), blc = b.name.toLowerCase();
  return alc > blc ? 1 : alc < blc ? -1 : a.name > b.name ? 1 : a.name < b.name ? -1 : 0;
});

Снова здесь вы можете выбрать localeCompare вместо этого, если вы не хотите, чтобы диакритические знаки влияли на сортировку следующим образом:

arr.sort(function(a,b){
  var lccomp = a.name.toLowerCase().localeCompare(b.name.toLowerCase());
  return lccomp ? lccomp : a.name > b.name ? 1 : a.name < b.name ? -1 : 0;
});

Подробнее о сортировке можно узнать здесь: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort

Ответ 3

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

objects.sort(function(o1, o2) {
    var n1 = o1.name, n2 = o2.name, ni1 = n1.toLowerCase(), ni2 = n2.toLowerCase();
    return ni1 === ni2 ? (n1 === n2 ? 0 : n1 > n2 ? 1 : -1) : (ni1 > ni2 ? 1 : -1);
});

Ответ 4

Немного изменен из Сортировка массива объектов,

yourobject.sort(function(a, b) {
    var nameA = a.name, nameB = b.name
    if (nameA < nameB) //Sort string ascending.
        return -1
    if (nameA > nameB)
        return 1
    return 0 //Default return value (no sorting).
})

Ответ 5

objects.sort(function(c, d) {
    return (
        c['name'].toLowerCase() > d['name'].toLowerCase() || 
            c['name'] > d['name']
    ) ? 1 : -1;
});

см. там http://jsfiddle.net/p8Gny/1/