Простая функция для сортировки массива объектов - PullRequest
36 голосов
/ 18 ноября 2011

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

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

Ответы [ 9 ]

109 голосов
/ 18 ноября 2011

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

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

function sort_by_key(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 = sort_by_key(people, 'name');

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

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

26 голосов
/ 18 ноября 2011

Вы можете отсортировать массив ([...]) с помощью функции .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
});
8 голосов
/ 18 ноября 2011

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

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

people.sort(function(a,b){ 
    var x = a.name < b.name? -1:1; 
    return x; 
});
1 голос
/ 26 июня 2018

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

people.sort((a, b) => a.toLocaleUpperCase() < b.toLocaleUpperCase() ? -1 : 1);
1 голос
/ 05 сентября 2017

Мое решение для аналогичной проблемы сортировки с использованием 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]);
}
1 голос
/ 23 декабря 2015

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

С небольшим отсеком и с помощью сортировки мы можем сделать это

0 голосов
/ 25 октября 2018
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
*/
0 голосов
/ 08 сентября 2017

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]);
}
0 голосов
/ 18 ноября 2011
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); 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...