У меня есть массив объектов с несколькими парами ключ-значение, и мне нужно отсортировать их на основе «updated_at»:
[
{
"updated_at" : "2012-01-01T06:25:24Z",
"foo" : "bar"
},
{
"updated_at" : "2012-01-09T11:25:13Z",
"foo" : "bar"
},
{
"updated_at" : "2012-01-05T04:13:24Z",
"foo" : "bar"
}
]
Какой самый эффективный способ сделать это?
javascript
arrays
object
печеньковый монстр
источник
источник
Ответы:
Вы можете использовать
Array.sort
.Вот пример:
источник
keyA - keyB
(или, возможно,keyB - keyA
)? У объектов даты естьvalueOf()
метод.a-b
действительно важна, если вы хотите избежать длинного кода. Хотя длинный код не обязательно плох в этом случае, я думаю, что многословие усложняет понимание. Я сейчас пользуюсьvalues.sort((a,b)=>a.attr-b.attr)
. Необходимость писать 5 строк каждый раз, когда вам нужно отсортировать массив, становится утомительной.Я уже ответил на очень похожий вопрос: простая функция для сортировки массива объектов
Для этого вопроса я создал эту маленькую функцию, которая может делать то, что вы хотите:
источник
-1
:)array = array.reverse()
функцию.Метод Array.sort () сортирует элементы массива на месте и возвращает массив. Будьте осторожны с Array.sort (), так как он не является неизменным . Для неизменной сортировки используйте immutable-sort .
Этот метод сортирует массив, используя ваш текущий
updated_at
формат ISO. Мы используемnew Data(iso_string).getTime()
для преобразования времени ISO в метку времени Unix. Метка времени Unix - это число, на котором мы можем сделать простую математику. Мы вычитаем первую и вторую временные метки; если первая временная метка больше второй, возвращаемое число будет положительным. Если второе число больше первого, возвращаемое значение будет отрицательным. Если два одинаковы, возврат будет равен нулю. Это прекрасно согласуется с необходимыми возвращаемыми значениями для встроенной функции.Для ES6 :
Для ES5 :
Если вы измените свои
updated_at
метки времени на Unix, вы можете сделать это:Для ES6 :
Для ES5 :
На момент написания этой статьи современные браузеры не поддерживают ES6. Для использования ES6 в современных браузерах используйте babel для переноса кода в ES5. Ожидайте поддержку браузера для ES6 в ближайшем будущем.
Array.sort () должен получить возвращаемое значение одного из 3 возможных результатов:
Для неизменной сортировки: (пример в ES6)
Вы также можете написать это так:
Импортирование, которое вы видите, является новым способом включения JavaScript в ES6 и делает ваш код очень чистым. Мой личный фаворит.
Неизменяемая сортировка не изменяет исходный массив, а возвращает новый массив. Использование
const
рекомендуется на неизменных данных.источник
Вот слегка измененная версия ответа @David Brainer-Bankers, который сортирует по алфавиту по строке или по номеру и гарантирует, что слова, начинающиеся с заглавных букв, не сортируются над словами, начинающимися со строчной буквы (например, «apple, Early») будет отображаться в этом порядке).
источник
Используйте подчеркивание js или lodash,
_.sortBy()
возвращает новый массивсм. http://underscorejs.org/#sortBy и документы lodash https://lodash.com/docs#sortBy
источник
С поддержкой ES2015 это можно сделать:
источник
new Date(iso_str).getTime()
, вернув метку времени Unix.Данные импортированы
В порядке возрастания
Пример заказа Asc
По убыванию
Пример для Desc Order
источник
Как говорится в этом ответе, вы можете использовать
Array.sort
.arr.sort(function(a,b){return new Date(a.updated_at) - new Date(b.updated_at)})
источник
Еще один, более математический способ сделать то же самое, но короче :
или в стиле гладкой лямбда-стрелки:
Этот метод может быть сделан с любым числовым вводом
источник
На сегодняшний день ответы @knowbody ( https://stackoverflow.com/a/42418963/6778546 ) и @Rocket Hazmat ( https://stackoverflow.com/a/8837511/6778546 ) можно объединить для обеспечения поддержки ES2015 и правильная обработка даты:
источник
Я создал функцию сортировки в Typescript, которую мы можем использовать для поиска строк, дат и чисел в массиве объектов. Он также может сортировать по нескольким полям.
Использование:
источник
Сортировка по дате в формате ISO может быть дорогой, если только вы не ограничиваете клиентов последними и лучшими браузерами, которые могут создать правильную метку времени путем анализа строки Date.
Если вы уверены в своем вводе и знаете, что это всегда будет гггг-мм-ддТчч: мм: сс и GMT (Z), вы можете извлечь цифры из каждого члена и сравнить их как целые числа
Если дата может быть отформатирована по-разному, вам может потребоваться добавить что-то для людей с ограниченными возможностями:
источник
Date.parse
?Для полноты здесь возможна краткая обобщенная реализация sortBy:
Обратите внимание, что здесь используется метод сортировки массивов, который сортирует по месту. для копирования вы можете использовать arr.concat () или arr.slice (0) или аналогичный метод для создания копии.
источник
При этом мы можем передать ключевую функцию для использования для сортировки
Тогда, например, если у нас есть
Мы можем сделать
или
или
источник
Вы можете использовать служебную библиотеку Lodash для решения этой проблемы (это довольно эффективная библиотека):
Вы можете найти документацию здесь: https://lodash.com/docs/4.17.15#orderBy
источник
Вы можете создать замыкание и передать его таким образом, вот мой пример работы
источник
источник
Array.sort()
для сортировки массива…
), чтобы сделать функцию чистойupdated_at
)Array.sort()
работает, вычитая два свойства из текущего и следующего элемента, если это число / объект, над которым вы можете выполнять аритмические операцииисточник
Я сталкиваюсь с тем же, так что я справляюсь с общим и почему я создаю функцию для этого:
источник