2016-12-05 2 views
3

Дайте следующий массив объектов, мне нужно отсортировать их по полю даты по возрастанию.Сортировка массива объектов с полем даты по дате

var myArray = [ 
    { 
    name: "Joe Blow", 
    date: "Mon Oct 31 2016 00:00:00 GMT-0700 (PDT)" 
    }, 
    { 
    name: "Sam Snead", 
    date: "Sun Oct 30 2016 00:00:00 GMT-0700 (PDT)" 
    }, 
    { 
    name: "John Smith", 
    date: "Sat Oct 29 2016 00:00:00 GMT-0700 (PDT)" 
    } 
]; 

так, что в этом примере, конечный результат будет Джон Смит, Сэм Снид, и Джо Blow.

Я пытаюсь использовать lodash-х _.sortBy(), но я не могу получить любой сортировки, чтобы иметь место независимо от того, как я пытаюсь использовать:

_.sortBy(myArray, function(dateObj) { 
    return dateObj.date; 
}); 

или

_.sortBy(myArray, 'date'); 

Что я нужно изменить, чтобы отсортировать мой массив правильно? У меня также есть Moment.js, поэтому я могу использовать его для форматирования строки даты, если это необходимо. Я попытался преобразовать свойство date с помощью .unix(), но это не изменило ситуацию.

Спасибо.

+0

Являются ли эти даты объекты или даты строки? – andlrc

+0

Стандартные строки строки Javascript. Как я уже сказал, при необходимости я могу преобразовать их в другой формат с помощью Moment, но преобразование в unix, похоже, не работает, и это, пожалуй, самый простой формат для сортировки. – wonder95

+0

Являются ли значения датами или строками? – Dekel

ответ

14

Вам не нужно lodash. Просто используйте метод JavaScript Array.prototype.sort.

Вам нужно будет создать Date объектов со строкой даты, прежде чем вы сможете их сравнить.

var myArray = [{ 
 
    name: "Joe Blow", 
 
    date: "Mon Oct 31 2016 00:00:00 GMT-0700 (PDT)" 
 
}, { 
 
    name: "Sam Snead", 
 
    date: "Sun Oct 30 2016 00:00:00 GMT-0700 (PDT)" 
 
}, { 
 
    name: "John Smith", 
 
    date: "Sat Oct 29 2016 00:00:00 GMT-0700 (PDT)" 
 
}]; 
 

 
myArray.sort(function compare(a, b) { 
 
    var dateA = new Date(a.date); 
 
    var dateB = new Date(b.date); 
 
    return dateA - dateB; 
 
}); 
 

 
console.log(myArray);

+0

И у него отличная поддержка браузера. Это было в спецификации с ECMAScript 3, что означает, что он работает во всех браузерах. (даже IE7) –

+2

Поскольку OP имеет момент.js, он должен использоваться для синтаксического анализа дат, а не для встроенной даты. – RobG

2

Ваши значения даты - это строки, поэтому вам необходимо использовать конструктор new Date(), чтобы изменить их на javascript date объектов. Таким образом, вы можете сортировать их (используя _.sortBy).

var myArray = [ 
 
    { 
 
    name: "Joe Blow", 
 
    date: "Mon Oct 31 2016 00:00:00 GMT-0700 (PDT)" 
 
    }, 
 
    { 
 
    name: "Sam Snead", 
 
    date: "Sun Oct 30 2016 00:00:00 GMT-0700 (PDT)" 
 
    }, 
 
    { 
 
    name: "John Smith", 
 
    date: "Sat Oct 29 2016 00:00:00 GMT-0700 (PDT)" 
 
    } 
 
]; 
 

 
myArray = _.sortBy(myArray, function(dateObj) { 
 
    return new Date(dateObj.date); 
 
}); 
 

 
console.log(myArray)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.2/lodash.min.js"></script>

1

Вот решение с использованием стандартного Javascript путем преобразования оба значения даты объекта и сравнения их стоимости.

myArray.sort((d1, d2) => new Date(d1.date).getTime() - new Date(d2.date).getTime()); 

Полный фрагмент кода:

var myArray = [ 
 
    { 
 
    name: "Joe Blow", 
 
    date: "Mon Oct 31 2016 00:00:00 GMT-0700 (PDT)" 
 
    }, 
 
    { 
 
    name: "Sam Snead", 
 
    date: "Sun Oct 30 2016 00:00:00 GMT-0700 (PDT)" 
 
    }, 
 
    { 
 
    name: "John Smith", 
 
    date: "Sat Oct 29 2016 00:00:00 GMT-0700 (PDT)" 
 
    } 
 
]; 
 

 
myArray.sort((d1, d2) => new Date(d1.date).getTime() - new Date(d2.date).getTime()); 
 

 
console.log(myArray);

 Смежные вопросы

  • Нет связанных вопросов^_^