Я пытаюсь отсортировать массив по строковой дате, и у меня возникают некоторые проблемы с ним.
Мой массив называется: myArray и содержит следующую информацию:
0: {…}
deployed_date: "29/01/2019 14:08:44"
last_restored_date: "11/01/2019 11:22:22"
1: {…}
deployed_date: "29/01/2019 14:08:19"
2: {…}
deployed_date: "29/01/2019 11:34:23"
3: {…}
deployed_date: "11/02/2019 11:24:33"
4: {…}
deployed_date: "11/02/2019 11:24:24"
last_restored_date: "11/01/2019 11:25:42"
Я использовал как Lodash, так и нативную сортировку JavaScript, но, к сожалению, я не могу сортировать только по этой дате deployed_date в порядке убывания.
К вашему сведению, я также использую momentjs:
myArray[key].deployed_date = moment(value.deployed_date,'YYYYMMDDHHmmss').format('DD/MM/YYYY HH:mm:ss');
Я использовал:
_.orderBy(myArray, ['deployed_date'],['desc']) // Лодаш
а также
myArray.sort()
Порядок выглядит так, как в моем массиве выше.
Я не уверен, связано ли это с тем фактом, что индексы массива 1,2 и 3 не имеют значения last_restored_date, но по какой-то причине массив неправильно отсортирован по развернутому_дате desc.
Ожидаемый результат:
11/02/2019 11:24:33
11/02/2019 11:24:24
29/01/2019 14:08:44
29/01/2019 14:08:19
29/01/2019 11:34:23
Как я могу добиться ожидаемого порядка результатов, показанного здесь?
@MrJ да, это так.
после сортировки вам нужны только даты на выходе или целые объекты?
весь объект, но в порядке убывания deployed_date, который представляет собой строку
Пожалуйста, постарайтесь воздержаться от txtspk здесь, Тони - мы ищем здесь читабельный, технический текст, насколько это возможно. Это не фейсбук.
@halfer Нет проблем. К вашему сведению, я не пользуюсь Facebook.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать карту в результирующем массиве, как это, чтобы получить ожидаемый результат
let new_arr = foo.map( (obj) => {
return obj.deployed_date;
);
Надеюсь, это имеет смысл
нужно, чтобы это было в порядке убывания
если сортировка дает неправильный ввод, попробуйте изменить дату на метку времени перед использованием сортировки, а затем преобразовать ее повторно
Не могли бы вы привести краткий пример для случая - спасибо.
Я приведу пример, но я только что увидел, что, возможно, ваша проблема с неправильным сокращением - это формат даты, который вы должны сначала проверить как простое и более лучшее решение. ваш формат - дд мм гггг, и он ожидает мм дд гггг, я думаю, сначала проверьте это.
Пожалуйста, используйте библиотеку моментов, чтобы сначала отформатировать дату в формате «ДД/ММ/ГГГГ ЧЧ: мм: сс», а приведенный ниже код будет сортировать и возвращать результат, который вы ищете.
x.sort((a,b)=>{
return moment(a,'DD/MM/YYY HH:mm:ss').isAfter(moment(b,'DD/MM/YYY HH:mm:ss')) ? -1 : 1
})
Привет. На самом деле использую момент - обновил свой пост выше.
затем moment(a,'DD/MM/YYY HH:mm:ss').isAfter(moment(b,'DD/MM/YYY HH:mm:ss')) сравнивает даты и соответствующим образом сортирует их.
Я попробовал ваше решение, используя moment(a.deployed_date, 'DD/MM/YYY HH:mm:ss').isAfter(moment(b.deployed_date,'DD/MM/YYY HH:mm:ss')), который, похоже, возвращает набор результатов в порядке убывания. Это b/c isAfter?
если вы хотите получить результат в порядке возрастания, верните 1, если условие удовлетворяет, иначе верните -1, например: return moment(a,'DD/MM/YYY HH:mm:ss').isAfter(moment(b,'DD/MM/YYY HH:mm:ss')) ? 1 : -1
Одним из решений является преобразование ваших дат в стандартный формат при сравнении deployed_date двух объектов с использованием Строка::localeCompare():
const myArray = [
{deployed_date: "29/01/2019 14:08:44", last_restored_date: "11/01/2019 11:22:22"},
{deployed_date: "29/01/2019 14:08:19"},
{deployed_date: "29/01/2019 11:34:23"},
{deployed_date: "11/02/2019 11:24:33"},
{deployed_date: "11/02/2019 11:24:24", last_restored_date: "11/01/2019 11:25:42"}
];
myArray.sort((a, b) =>
{
let [aDate, aHour] = a.deployed_date.split(" ");
let [bDate, bHour] = b.deployed_date.split(" ");
let [aDay, aMonth, aYear] = aDate.split("/");
let [bDay, bMonth, bYear] = bDate.split("/");
let newADate = `${aYear}/${aMonth}/${aDay} ${aHour}`;
let newBDate = `${bYear}/${bMonth}/${bDay} ${bHour}`;
return newBDate.localeCompare(newADate);
});
console.info(myArray);как бы я использовал ваше решение, если бы я использовал момент, как описано выше?
@tonyf Когда я читал вопрос, этого не было. Однако то, что я вижу, deployed_date - это строка, потому что moment.format() возвращает строку, поэтому предыдущее должно работать. У вас есть какая-то конкретная ошибка?
const toDate = str => {
const [d, t] = str.split(' ')
return new Date(`${d.split('/').reverse().join('-')}T${t}Z`).getTime();
};
const compareByDate = (x, y) => toDate(y.deployed_date) - toDate(x.deployed_date);
const arr = [
{deployed_date: "29/01/2019 14:08:44"},
{deployed_date: "29/01/2019 14:08:19"},
{deployed_date: "29/01/2019 11:34:23"},
{deployed_date: "11/02/2019 11:24:33"},
{deployed_date: "11/02/2019 11:24:24"}
];
arr.sort(compareByDate);
console.info(arr);Date.getTime()) для облегчения сравнения. Используйте конструктор Дата, чтобы изменить строку на дату. Затем конвертируйте эту дату в миллисекунды(x, y) => y - x;deployed_dateМы хотим использовать формат ISO YYYY-MM-DDTHH:MM:SSZ. А так как у нас есть 29/01/2019 14:08:44 нам нужно сделать некоторую обработку.
' ', чтобы разделить время и Дата'/' и переверните массив, так как нам нужен YYYY-MM_DD. Затем join с использованием символа '-'new Date(...), затем конвертируйте ее в миллисекунды с помощью Date.getMilliseconds()Как я это вижу, вы хорошо используете orderBy lodash, и он должен был упорядочить ваши данные, как и ожидалось. Что вызывает у вас проблемы, так это то, что вы сортируете строки, а не даты, и ваши строки имеют формат ДД/ММ/ГГГГ, который не идеален, если вы хотите их сортировать: 01/01/2019 «до» 31/12/2018 (хотя и бессмысленно).
Что ты можешь сделать: 1/ вы можете иметь данные даты или момента вместо строк 2/или отформатируйте даты как ГГГГ-ММ-ДД... и т.д. 3/ или передать функцию сортировке ˋ_.orderBy(myArray, [d => moment(d.deployed_data, ...)], ['desc'])`
какова структура myArray? это массив объектов?