10

Сортировка свойств объекта по значениям

16

У меня есть объект JavaScript следующего вида:

var list = {
  "you": 100, 
  "me": 75, 
  "foo": 116, 
  "bar": 15
};

Есть ли способ отсортировать свойства этого объекта по значению? В итоге я хотел бы получить объект в следующем виде:

list = {
  "bar": 15, 
  "me": 75, 
  "you": 100, 
  "foo": 116
};

Как это можно реализовать?

5 ответ(ов)

5

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

var list = {"you": 100, "me": 75, "foo": 116, "bar": 15};
var keysSorted = Object.keys(list).sort(function(a, b) {
    return list[a] - list[b];
});
console.log(keysSorted); // bar, me, you, foo

В этом коде мы сначала получаем массив ключей с помощью Object.keys(), а затем сортируем его методом sort(), используя функцию сравнения, которая основана на значениях ассоциативного массива list. Это позволяет нам получить отсортированные ключи без создания дополнительной копии всей структуры данных.

2

Ваши объекты могут иметь любое количество свойств, и вы можете сортировать их по любому свойству объекта, будь это число или строка, если поместите объекты в массив. Рассмотрим следующий массив:

var arrayOfObjects = [   
    {
        name: 'Дина',
        born: 1373925600000, // Пн, 15 июля 2013
        num: 4,
        sex: 'женский'
    },
    {
        name: 'Бейонсе',
        born: 1366832953000, // Ср, 24 апреля 2013
        num: 2,
        sex: 'женский'
    },
    {            
        name: 'Альберт',
        born: 1370288700000, // Пн, 3 июня 2013
        num: 3,
        sex: 'мужской'
    },    
    {
        name: 'Дорис',
        born: 1354412087000, // Сб, 1 декабря 2012
        num: 1,
        sex: 'женский'
    }
];

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

// используем slice(), чтобы скопировать массив, а не просто создать ссылку
var byDate = arrayOfObjects.slice(0);
byDate.sort(function(a, b) {
    return a.born - b.born;
});
console.log('по дате:');
console.log(byDate);

Для сортировки по имени используйте следующий код:

var byName = arrayOfObjects.slice(0);
byName.sort(function(a, b) {
    var x = a.name.toLowerCase();
    var y = b.name.toLowerCase();
    return x < y ? -1 : x > y ? 1 : 0;
});

console.log('по имени:');
console.log(byName);

Дополнительный пример можно найти по следующей ссылке: http://jsfiddle.net/xsM5s/16/

0

В JavaScript объекты по своей сути неупорядочены (см. Спецификацию языка ECMAScript, раздел 8.6). Спецификация языка даже не гарантирует, что если вы дважды последовательно переберёте свойства объекта, они будут возвращены в том же порядке во второй раз.

Если вам необходим порядок, используйте массив и метод Array.prototype.sort.

0

В вашем коде реализована функция sortAssocObject, которая сортирует ассоциативный массив (объект) по значениям и возвращает новый объект с отсортированными парами ключ-значение. Давайте разберём шаги более подробно.

  1. Создание массива пар ключ-значение: Вы инициализируете пустой массив sortable и заполняете его парами [ключ, значение] из исходного объекта list с помощью цикла for...in.

    for (var key in list) {
        sortable.push([key, list[key]]);
    }
    

    После этого sortable будет выглядеть так: [["you", 100], ["me", 75], ["foo", 116], ["bar", 15]].

  2. Сортировка: Затем вы сортируете массив sortable по значению (второму элементу подмассива) с использованием метода sort(). Заданная функция сравнения сортирует массив по возрастанию:

    sortable.sort(function(a, b) {
        return (a[1] < b[1] ? -1 : (a[1] > b[1] ? 1 : 0));
    });
    

    В результате массив будет отсортирован по значениям, и теперь он будет выглядеть так: [["bar", 15], ["me", 75], ["you", 100], ["foo", 116]].

  3. Создание нового объекта: Далее вы создаёте новый объект orderedList, в который добавляете отсортированные пары ключ-значение из sortable:

    var orderedList = {};
    for (var idx in sortable) {
        orderedList[sortable[idx][0]] = sortable[idx][1];
    }
    
  4. Возврат отсортированного объекта: Наконец, вы возвращаете новый объект orderedList, который будет содержать те же ключи, но в соответствии с отсортированными значениями:

    return orderedList;
    

После вызова функции sortAssocObject(list) результатом будет объект {bar: 15, me: 75, you: 100, foo: 116}, где ключи расположены в порядке возрастания значений.

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

sortable.sort(function(a, b) {
    return (a[1] > b[1] ? -1 : (a[1] < b[1] ? 1 : 0));
});

Таким образом, вы получите объект, отсортированный по убыванию значений.

0

Если вам нужно отсортировать объект по его значениям без использования нескольких циклов for, вы можете использовать метод Object.entries() для преобразования объекта в массив пар ключ-значение, затем отсортировать этот массив и, наконец, преобразовать его обратно в объект с помощью Object.fromEntries(). Вот пример кода:

const list = {
    "you": 100, 
    "me": 75, 
    "foo": 116, 
    "bar": 15
};

let sorted = Object.fromEntries(
                Object.entries(list).sort((a, b) => a[1] - b[1])
             );
console.log('Отсортированный объект: ', sorted);

В этом примере Object.entries(list) создает массив массивов, где каждый внутренний массив содержит ключ и значение. Затем мы используем метод sort() для сортировки этого массива по значениям (второй элемент каждого внутреннего массива). Вызов Object.fromEntries() преобразует отсортированный массив обратно в объект.

Если вам нужно сортировать по ключам, просто измените индексы в функции sort() на 0:

let sortedByKey = Object.fromEntries(
                Object.entries(list).sort((a, b) => a[0].localeCompare(b[0]))
             );
console.log('Отсортированный объект по ключам: ', sortedByKey);

Таким образом, вы сможете сортировать объект по его значениям или ключам без необходимости использования нескольких циклов for.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь