2

I have multidimensional object array which I want to sort by date. Below I added one of the ways I tried to do it, however unsuccessfully. Is there any simple way to sort it without looping?

let araaaay = [
  [{
      "dateTime": "2020-01-22T00:00:00",
      "date": "2020 01 22",
      "hour": 0,
      "postsCount": 1,
      "shift": "None"
    }, 
  ],
  [{
    "dateTime": "2020-01-19T00:00:00",
    "date": "2020 01 19",
    "hour": 0,
    "postsCount": 2,
    "shift": "A"
  }, {
    "dateTime": "2020-01-19T23:00:00",
    "date": "2020 01 19",
    "hour": 23,
    "postsCount": 2,
    "shift": "None"
  }],
  [{
    "dateTime": "2020-01-20T00:00:00",
    "date": "2020 01 20",
    "hour": 0,
    "postsCount": 0,
    "shift": "None"
  }, {
    "dateTime": "2020-01-20T01:00:00",
    "date": "2020 01 20",
    "hour": 1,
    "postsCount": 0,
    "shift": "None"
  }, {
    "dateTime": "2020-01-20T17:00:00",
    "date": "2020 01 20",
    "hour": 17,
    "postsCount": 4,
    "shift": "None"
  }, {
    "dateTime": "2020-01-20T18:00:00",
    "date": "2020 01 20",
    "hour": 18,
    "postsCount": 4,
    "shift": "None"
  } ],
  [{
      "dateTime": "2020-01-18T00:00:00",
      "date": "2020 01 18",
      "hour": 0,
      "postsCount": 0,
      "shift": "A"
    }, {
      "dateTime": "2020-01-18T03:00:00",
      "date": "2020 01 18",
      "hour": 3,
      "postsCount": 4,
      "shift": "A"
    }, {
      "dateTime": "2020-01-18T04:00:00",
      "date": "2020 01 18",
      "hour": 4,
      "postsCount": 8,
      "shift": "A"
    }, {
      "dateTime": "2020-01-18T05:00:00",
      "date": "2020 01 18",
      "hour": 5,
      "postsCount": 10,
      "shift": "B"
    }, {
      "dateTime": "2020-01-18T06:00:00",
      "date": "2020 01 18",
      "hour": 6,
      "postsCount": 8,
      "shift": "B"
    }, {
      "dateTime": "2020-01-18T07:00:00",
      "date": "2020 01 18",
      "hour": 7,
      "postsCount": 2,
      "shift": "B"
    },
    {
      "dateTime": "2020-01-18T08:00:00",
      "date": "2020 01 18",
      "hour": 8,
      "postsCount": 0,
      "shift": "B"
    },
    {
    "dateTime": "2020-01-21T22:00:00",
    "date": "2020 01 21",
    "hour": 22,
    "postsCount": 0,
    "shift": "None"
  }, {
    "dateTime": "2020-01-21T23:00:00",
    "date": "2020 01 21",
    "hour": 23,
    "postsCount": 0,
    "shift": "None"
  }],
  [{
    "dateTime": "2020-01-23T00:00:00",
    "date": "2020 01 23",
    "hour": 0,
    "postsCount": 0,
    "shift": "None"
  },  {
    "dateTime": "2020-01-23T07:00:00",
    "date": "2020 01 23",
    "hour": 7,
    "postsCount": 1,
    "shift": "None"
  },  {
    "dateTime": "2020-01-23T21:00:00",
    "date": "2020 01 23",
    "hour": 21,
    "postsCount": 1,
    "shift": "None"
  }]
];

let newArray = araaaay.sort(function(a, b) {
  return a.dateTime - b.dateTime;
});

console.log(newArray);

let newArray2 = araaaay.sort(function(a, b) {
  return a[0].dateTime - b[0].dateTime;
});

// console.log(newArray2);

1
  • 1
    return new Date(a[0].dateTime) - new Date(b[0].dateTime);? be careful, the js engine implementations are different, so you have to take care of it. I recommend you to use momentjs for parsing the date strings. Commented May 6, 2020 at 20:28

2 Answers 2

3

It looks like each group has different entries for the same day, but with different times. That means you need two different sorts there:

An inner one that sorts objects within a group (by dateTime) and an outer one that sorts group (by the date or dateTime of any of its entries):

const arr = [
  [{
    "dateTime": "2020-01-22T00:00:00",
    "date": "2020 01 22",
    "hour": 0,
    "postsCount": 1,
    "shift": "None"
  }], [{
    "dateTime": "2020-01-19T00:00:00",
    "date": "2020 01 19",
    "hour": 0,
    "postsCount": 2,
    "shift": "A"
  }, {
    "dateTime": "2020-01-19T23:00:00",
    "date": "2020 01 19",
    "hour": 23,
    "postsCount": 2,
    "shift": "None"
  }], [{
    "dateTime": "2020-01-20T00:00:00",
    "date": "2020 01 20",
    "hour": 0,
    "postsCount": 0,
    "shift": "None"
  }, {
    "dateTime": "2020-01-20T01:00:00",
    "date": "2020 01 20",
    "hour": 1,
    "postsCount": 0,
    "shift": "None"
  }, {
    "dateTime": "2020-01-20T17:00:00",
    "date": "2020 01 20",
    "hour": 17,
    "postsCount": 4,
    "shift": "None"
  }, {
    "dateTime": "2020-01-20T18:00:00",
    "date": "2020 01 20",
    "hour": 18,
    "postsCount": 4,
    "shift": "None"
  }], [{
    "dateTime": "2020-01-18T00:00:00",
    "date": "2020 01 18",
    "hour": 0,
    "postsCount": 0,
    "shift": "A"
  }, {
    "dateTime": "2020-01-18T03:00:00",
    "date": "2020 01 18",
    "hour": 3,
    "postsCount": 4,
    "shift": "A"
  }, {
    "dateTime": "2020-01-18T04:00:00",
    "date": "2020 01 18",
    "hour": 4,
    "postsCount": 8,
    "shift": "A"
  }, {
    "dateTime": "2020-01-18T05:00:00",
    "date": "2020 01 18",
    "hour": 5,
    "postsCount": 10,
    "shift": "B"
  }, {
    "dateTime": "2020-01-18T06:00:00",
    "date": "2020 01 18",
    "hour": 6,
    "postsCount": 8,
    "shift": "B"
  }, {
    "dateTime": "2020-01-18T07:00:00",
    "date": "2020 01 18",
    "hour": 7,
    "postsCount": 2,
    "shift": "B"
  }, {
    "dateTime": "2020-01-18T08:00:00",
    "date": "2020 01 18",
    "hour": 8,
    "postsCount": 0,
    "shift": "B"
  }], [{
    "dateTime": "2020-01-21T22:00:00",
    "date": "2020 01 21",
    "hour": 22,
    "postsCount": 0,
    "shift": "None"
  }, {
    "dateTime": "2020-01-21T23:00:00",
    "date": "2020 01 21",
    "hour": 23,
    "postsCount": 0,
    "shift": "None"
  }], [{
    "dateTime": "2020-01-23T00:00:00",
    "date": "2020 01 23",
    "hour": 0,
    "postsCount": 0,
    "shift": "None"
  }, {
    "dateTime": "2020-01-23T07:00:00",
    "date": "2020 01 23",
    "hour": 7,
    "postsCount": 1,
    "shift": "None"
  }, {
    "dateTime": "2020-01-23T21:00:00",
    "date": "2020 01 23",
    "hour": 21,
    "postsCount": 1,
    "shift": "None"
  }],
];


// Inner sort ("by time"):
let sorted = arr.map((group) => {
  return group.sort((a, b) => {
    return new Date(a.dateTime) - new Date(b.dateTime);
  });
});

// Outer sort ("by day"):
sorted = arr.sort((a, b) => {
  return new Date(a[0].dateTime) - new Date(b[0].dateTime);
});

console.log(sorted.map(item => item.map(item => item.dateTime)))
.as-console-wrapper {
  max-height: 100% !important;
}

Sign up to request clarification or add additional context in comments.

Comments

1

you need to use array flat before :

const
  araaaay = 
    [ [ { dateTime: '2020-01-22T00:00:00', date: '2020 01 22', hour:  0, postsCount:  1, shift: 'None' } 
      ] 
    , [ { dateTime: '2020-01-19T00:00:00', date: '2020 01 19', hour:  0, postsCount:  2, shift: 'A'    } 
      , { dateTime: '2020-01-19T23:00:00', date: '2020 01 19', hour: 23, postsCount:  2, shift: 'None' } 
      ] 
    , [ { dateTime: '2020-01-20T00:00:00', date: '2020 01 20', hour:  0, postsCount:  0, shift: 'None' } 
      , { dateTime: '2020-01-20T01:00:00', date: '2020 01 20', hour:  1, postsCount:  0, shift: 'None' } 
      , { dateTime: '2020-01-20T17:00:00', date: '2020 01 20', hour: 17, postsCount:  4, shift: 'None' } 
      , { dateTime: '2020-01-20T18:00:00', date: '2020 01 20', hour: 18, postsCount:  4, shift: 'None' } 
      ] 
    , [ { dateTime: '2020-01-18T00:00:00', date: '2020 01 18', hour:  0, postsCount:  0, shift: 'A'    } 
      , { dateTime: '2020-01-18T03:00:00', date: '2020 01 18', hour:  3, postsCount:  4, shift: 'A'    } 
      , { dateTime: '2020-01-18T04:00:00', date: '2020 01 18', hour:  4, postsCount:  8, shift: 'A'    } 
      , { dateTime: '2020-01-18T05:00:00', date: '2020 01 18', hour:  5, postsCount: 10, shift: 'B'   } 
      , { dateTime: '2020-01-18T06:00:00', date: '2020 01 18', hour:  6, postsCount:  8, shift: 'B'    } 
      , { dateTime: '2020-01-18T07:00:00', date: '2020 01 18', hour:  7, postsCount:  2, shift: 'B'    } 
      , { dateTime: '2020-01-18T08:00:00', date: '2020 01 18', hour:  8, postsCount:  0, shift: 'B'    } 
      , { dateTime: '2020-01-21T22:00:00', date: '2020 01 21', hour: 22, postsCount:  0, shift: 'None' } 
      , { dateTime: '2020-01-21T23:00:00', date: '2020 01 21', hour: 23, postsCount:  0, shift: 'None' } 
      ] 
    , [ { dateTime: '2020-01-23T00:00:00', date: '2020 01 23', hour:  0, postsCount:  0, shift: 'None' } 
      , { dateTime: '2020-01-23T07:00:00', date: '2020 01 23', hour:  7, postsCount:  1, shift: 'None' } 
      , { dateTime: '2020-01-23T21:00:00', date: '2020 01 23', hour: 21, postsCount:  1, shift: 'None' } 
      ] ]

const aSorted = araaaay
                  .flat()
                  .sort((a,b)=>new Date(a.dateTime) - new Date(b.dateTime))

console.log (aSorted)
.as-console-wrapper { max-height: 100% !important; }

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.