1

I have an array of objects that I want to sort first by date and next by its numeric value.

let arr = [  
  {date: 2018-06-19 12:05:43.232Z, value: 3},
  {date: 2018-06-20 12:05:43.232Z, value: 4},  
  {date: 2018-06-18 12:05:43.232Z, value: 2},  
  {date: 2018-06-20 12:05:43.232Z, value: 4}, 
  {date: 2018-06-19 12:05:43.232Z, value: 5},     
  {date: 2018-06-18 12:05:43.232Z, value: 5},  
  {date: 2018-06-20 12:05:43.232Z, value: 5},  
  {date: 2018-06-19 12:05:43.232Z, value: 4},  
]

I want to sort each index by the date and the value so the result would be :

let arr = [
  {date: 2018-06-18 12:05:43.232Z, value: 2},
  {date: 2018-06-18 12:05:43.232Z, value: 5},

  {date: 2018-06-19 12:05:43.232Z, value: 3},
  {date: 2018-06-19 12:05:43.232Z, value: 4},
  {date: 2018-06-19 12:05:43.232Z, value: 5}, 

  {date: 2018-06-20 12:05:43.232Z, value: 3},
  {date: 2018-06-20 12:05:43.232Z, value: 4},     
  {date: 2018-06-20 12:05:43.232Z, value: 5},     
]

How can it be done?

Melchia
  • 22,578
  • 22
  • 103
  • 117
obiwankenoobi
  • 1,504
  • 5
  • 18
  • 37

2 Answers2

5

You can use Array.sort with ||

const res = arr.sort((a, b) => Date.parse(a.date) - Date.parse(b.date) || a.value - b.value);
console.log(res);
<script>
let arr = [{
    date: '2018-06-19 12:05:43.232Z',
    value: 3
  },
  {
    date: '2018-06-20 12:05:43.232Z',
    value: 4
  },
  {
    date: '2018-06-18 12:05:43.232Z',
    value: 2
  },
  {
    date: '2018-06-20 12:05:43.232Z',
    value: 4
  },
  {
    date: '2018-06-19 12:05:43.232Z',
    value: 5
  },
  {
    date: '2018-06-18 12:05:43.232Z',
    value: 5
  },
  {
    date: '2018-06-20 12:05:43.232Z',
    value: 5
  },
  {
    date: '2018-06-19 12:05:43.232Z',
    value: 4
  },
]
</script>
baao
  • 71,625
  • 17
  • 143
  • 203
0

Yo can do it using lodash library. If you check the docs of orderBy function you'll see that, it is exactly what you need.

let arr = [  
  {"date": "2018-06-19 12:05:43.232Z", "value": 3},
  {"date": "2018-06-20 12:05:43.232Z", "value": 4},  
  {"date": "2018-06-18 12:05:43.232Z", "value": 2},  
  {"date": "2018-06-20 12:05:43.232Z", "value": 4}, 
  {"date": "2018-06-19 12:05:43.232Z", "value": 5},     
  {"date": "2018-06-18 12:05:43.232Z", "value": 5},  
  {"date": "2018-06-20 12:05:43.232Z", "value": 5},  
  {"date": "2018-06-19 12:05:43.232Z", "value": 4}  
]

Applying _orderBy on your array as follows:

_.orderBy(arr, ['date', 'value'], ['asc', 'asc']);

will get you the result that you want.

Check the example below:

let arr = [  
  {"date": "2018-06-19 12:05:43.232Z", "value": 3},
  {"date": "2018-06-20 12:05:43.232Z", "value": 4},  
  {"date": "2018-06-18 12:05:43.232Z", "value": 2},  
  {"date": "2018-06-20 12:05:43.232Z", "value": 4}, 
  {"date": "2018-06-19 12:05:43.232Z", "value": 5},     
  {"date": "2018-06-18 12:05:43.232Z", "value": 5},  
  {"date": "2018-06-20 12:05:43.232Z", "value": 5},  
  {"date": "2018-06-19 12:05:43.232Z", "value": 4}  
]



console.log(_.orderBy(arr, ['date', 'value'], ['asc', 'asc']))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.js"></script>
Boky
  • 11,554
  • 28
  • 93
  • 163