Помогите пожалуйста мне с сортировкой. Я должен отсортировать объект с пользовательской строкой даты

var object = [{
  name: "something",
  date: "23.12.2016"
},
{
  name: "something2",
  date: "19.12.2016"
}]

Как сортировать объект, как это? Я уже пробовал с функцией сортировки return new Date(a.date) - new Date(b.date);, но у меня ничего не получалось Благодарность !

1
Андрей Гузюк 6 Янв 2017 в 14:45

3 ответа

Лучший ответ

Вы можете разделить дату и изменить ее как изо-дату и отсортировать по строке с помощью localeCompare.

var object = [{ name: "something", date: "23.12.2016" }, { name: "something2", date: "19.12.2016" }];

object.sort(function (a, b) {
    var aa = a.date.split('.'),
        bb = b.date.split('.');
  
    return [aa[2], aa[1], aa[0]].join('-').localeCompare([bb[2], bb[1], bb[0]].join('-'));
});

console.log(object);

Вы также можете использовать String#replace для изменения порядка строк.

var object = [{ name: "something", date: "23.12.2016" }, { name: "something2", date: "19.12.2016" }];

object.sort(function (a, b) {
    var aa = a.date.replace(/(..).(..).(....)/, '$3-$2-$1'),
        bb = b.date.replace(/(..).(..).(....)/, '$3-$2-$1');

    return aa.localeCompare(bb);
});

console.log(object);
2
Nina Scholz 6 Янв 2017 в 12:20

Из любопытства я попробовал вариант о ответе Нины Шольц, возможно, это быстрее, а может и нет. Я считаю переформатирование даты довольно очевидным, но это также отнимает много времени. В моей версии дубликаты индексов, вероятно, являются проблемой, но как вы заявили, что формат заполнено нулями, это будет работать:

var object = [{ name: "something", date: "23.12.2016" }, { name: "something2", date: "19.12.2016" }];

object.sort(function (a, b) {
    return (a.date[6] - b.date[6]) 
        || (a.date[7] - b.date[7])
        || (a.date[8] - b.date[8])
        || (a.date[9] - b.date[9])
        || (a.date[3] - b.date[3])
        || (a.date[4] - b.date[4])
        || (a.date[0] - b.date[0])
        || (a.date[1] - b.date[1]);
});

console.log(object);
1
Community 23 Май 2017 в 12:13

Решение с использованием функций Date.parse() и String.prototype.replace() (для сортировки по отметкам времени ):

var date_objects = [{ name: "something", date: "23.12.2016" }, { name: "something2", date: "19.12.2016" }];

date_objects.sort(function(a,b){
    return Date.parse(a.date.replace(/^(\d{2})\.(\d{2})\.(\d{4})$/, '$3-$2-$1'))
            - Date.parse(b.date.replace(/^(\d{2})\.(\d{2})\.(\d{4})$/, '$3-$2-$1'))
});

console.log(date_objects);
1
RomanPerekhrest 6 Янв 2017 в 12:11