Простая функция для сортировки массива объектов
Я хочу создать (неанонимную) функцию, которая будет сортировать массив объектов по алфавиту по ключу name
. Я использую только чистый JavaScript, поэтому фреймворки мне не помогают.
Вот пример массива, который я хочу отсортировать:
var people = [
{'name': 'a75', 'item1': false, 'item2': false},
{'name': 'z32', 'item1': true, 'item2': false},
{'name': 'e77', 'item1': false, 'item2': false}
];
Как я могу реализовать такую функцию?
5 ответ(ов)
Да, это хороший подход! В вашем примере кода вы создали функцию sort_by_key
, которая принимает массив объектов и ключ, по которому нужно сортировать. Это позволяет гибко сортировать массивы объектов по любому свойству, а не только по имени.
Вот краткое объяснение, что происходит в коде:
- Вы создаете массив объектов
people
, каждый из которых имеет свойстваname
,item1
иitem2
. - Функция
sort_by_key
принимает два аргумента: массив и ключ. Она сортирует массив в порядке возрастания на основе указанного ключа. - Внутри функции используется метод
sort
, который сравнивает два объекта и возвращает -1, 0 или 1, чтобы определить порядок сортировки. - В конце вы вызываете функцию
sort_by_key
, передавая ей массив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) { // неанонимная функция по вашему запросу...
return b.name < a.name ? 1 // если b должно быть раньше, перемещаем a в конец
: b.name > a.name ? -1 // если b должно быть позже, перемещаем a в начало
: 0; // a и b равны
});
В приведенном коде массив people
сортируется по имени в обратном порядке (от Z к A). Функция обратного вызова сравнивает имена объектов a
и b
и возвращает соответствующее значение для определения их порядка в отсортированном массиве.
Это не совсем вопрос о JSON, а скорее о массиве в JavaScript.
Попробуйте следующий код:
people.sort(function(a, b) {
var x = a.name < b.name ? -1 : 1;
return x;
});
Этот код сортирует массив people
по имени (свойству name
). Если имя первого элемента меньше, чем имя второго, возвращается -1
, что указывает на то, что первый элемент должен предшествовать второму в отсортированном массиве. Если имя второго элемента меньше или равно первому, возвращается 1
, что помещает второй элемент перед первым. Не забудьте, что для корректной работы сортировки нужно учитывать случаи, когда имена могут совпадать. Вам также может понадобиться улучшить логику для правильной сортировки при равенстве:
people.sort(function(a, b) {
return a.name.localeCompare(b.name);
});
Этот вариант использует метод localeCompare
, который учитывает языковые особенности при сравнении строк.
Вы можете изменить ответ @Geuis, воспользовавшись функцией sort()
с использованием стрелочной функции (lambda) и сначала преобразовав строки в верхний регистр. Ваш код может выглядеть следующим образом:
people.sort((a, b) => a.toLocaleUpperCase() < b.toLocaleUpperCase() ? -1 : 1);
Этот код сортирует массив people
, сравнивая строки в верхнем регистре, что позволяет игнорировать регистр при сортировке. Если a
меньше b
, функция вернет -1, что указывает на то, что a
следует передать перед b
в отсортированном массиве.
Ваш код имеет хороший подход, но в функции сортировки есть небольшая ошибка. В методе sort
вы используете оператор сравнения >
, который возвращает булево значение (true или false), а это не всегда корректно для сортировки. Вместо этого вам нужно использовать разницу между значениями строк.
Вот исправленный вариант вашего кода:
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.localeCompare(b.name));
// Выводим отсортированный массив
for (let k in sorted_by_name) {
console.log(sorted_by_name[k]);
}
В этом изменении я использовал метод localeCompare
, который корректно сравнивает строки, учитывая локализацию. Теперь массив будет отсортирован по именам в алфавитном порядке.
Пожалуйста, дайте знать, если у вас есть дополнительные вопросы или вам нужна помощь с чем-то еще!
Сортировка массива объектов по значению строкового свойства
Сортировка массива объектов по значениям свойств
Сортировка свойств объекта по значениям
Сортировка объекта JavaScript по ключу
Изменяет ли функция .sort оригинальный массив?