Простая функция для сортировки массива объектов

Я хотел бы создать (неанонимную) функцию, которая сортирует массив объектов в алфавитном порядке по ключу name, Я пишу только простой JavaScript, поэтому фреймворки не помогают мне ни в малейшей степени.

var people = [
    {'name': 'a75', 'item1': false, 'item2': false},
    {'name': 'z32', 'item1': true,  'item2': false},
    {'name': 'e77', 'item1': false, 'item2': false}
];

13 ответов

Решение

Как насчет этого?

var people = [
{
    name: 'a75',
    item1: false,
    item2: false
},
{
    name: 'z32',
    item1: true,
    item2: false
},
{
    name: 'e77',
    item1: false,
    item2: false
}];

function sortByKey(array, key) {
    return array.sort(function(a, b) {
        var x = a[key]; var y = b[key];
        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
    });
}

people = sortByKey(people, 'name');

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

А вот и jsFiddle: http://jsfiddle.net/6Dgbu/

Вы можете отсортировать массив ([...]) с .sort функция:

var people = [
    {'name': 'a75', 'item1': false, 'item2': false},
    {'name': 'z32', 'item1': true,  'item2': false},
    {'name': 'e77', 'item1': false, 'item2': false},
];

var sorted = people.sort(function IHaveAName(a, b) { // non-anonymous as you ordered...
    return b.name < a.name ?  1 // if b should come earlier, push a to end
         : b.name > a.name ? -1 // if b should come later, push a to begin
         : 0;                   // a and b are equal
});

Это не вопрос JSON, по сути. Это вопрос массива javascript.

Попробуй это:

people.sort(function(a,b){ 
    var x = a.name < b.name? -1:1; 
    return x; 
});

Я изменил ответ @Geuis, используя лямбду, и сначала преобразовал его в верхний регистр:

people.sort((a, b) => a.toLocaleUpperCase() < b.toLocaleUpperCase() ? -1 : 1);

Мое решение для аналогичной проблемы сортировки с использованием ECMA 6

var library = [
        {name: 'Steve', course:'WAP', courseID: 'cs452'}, 
        {name: 'Rakesh', course:'WAA', courseID: 'cs545'},
        {name: 'Asad', course:'SWE', courseID: 'cs542'},
];

const sorted_by_name = library.sort( (a,b) => a.name > b.name );

for(let k in sorted_by_name){
    console.log(sorted_by_name[k]);
}

Array.prototype.sort_by = function(key_func, reverse=false){
    return this.sort( (a, b) => ( key_func(b) - key_func(a) ) * (reverse ? 1 : -1) ) 
}

Тогда, например, если у нас есть

var arr = [ {id: 0, balls: {red: 8,  blue: 10}},
            {id: 2, balls: {red: 6 , blue: 11}},
            {id: 1, balls: {red: 4 , blue: 15}} ]

arr.sort_by(el => el.id, reverse=true)
/* would result in
[ { id: 2, balls: {red: 6 , blue: 11 }},
  { id: 1, balls: {red: 4 , blue: 15 }},
  { id: 0, balls: {red: 8 , blue: 10 }} ]
*/

или же

arr.sort_by(el => el.balls.red + el.balls.blue)
/* would result in
[ { id: 2, balls: {red: 6 , blue: 11 }},    // red + blue= 17
  { id: 0, balls: {red: 8 , blue: 10 }},    // red + blue= 18
  { id: 1, balls: {red: 4 , blue: 15 }} ]   // red + blue= 19
*/

var data = [ 1, 2, 5, 3, 1]; data.sort(function(a,b) { return a-b });

С небольшим отсеком и используя сортировку, мы можем сделать это

Вот как я просто сортирую из предыдущих примеров:

если мой массив items:

0: {id: 14, auctionID: 76, userID: 1, amount: 39}
1: {id: 1086, auctionID: 76, userID: 1, amount: 55}
2: {id: 1087, auctionID: 76, userID: 1, amount: 55}

Я думал просто звонить items.sort() сортировать его, но возникли две проблемы: 1. Сортировка строк 2. Сортировка их по первому ключу.

Вот как я изменил функцию сортировки:

for(amount in items){
if(item.hasOwnProperty(amount)){

i.sort((a, b) => a.amount - b.amount);
}
}

Сортировка по алфавиту с помощью лямбда-функции:

      arr.sort((a, b) => a.name.localeCompare(b.name));

var library = [
        {name: 'Steve', course:'WAP', courseID: 'cs452'}, 
        {name: 'Rakesh', course:'WAA', courseID: 'cs545'},
        {name: 'Asad', course:'SWE', courseID: 'cs542'},
];

const sorted_by_name = library.sort( (a,b) => a.name > b.name );

for(let k in sorted_by_name){
    console.log(sorted_by_name[k]);
}

var people = 
[{"name": 'a75',"item1": "false","item2":"false"}, 
{"name": 'z32',"item1": "true","item2":  "false"}, 
{"name": 'e77',"item1": "false","item2": "false"}]; 

function mycomparator(a,b) {   return parseInt(a.name) - parseInt(b.name);  } 
people.sort(mycomparator); 

что-то вроде этого (или, как мы привыкли говорить, это должно работать).

Другие вопросы по тегам