Сортировать массив, полный дат ISO, используя Moment js - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь отсортировать массив дат ISO.

arr = ["2019-12-30T00:00:00.000Z", "2020-01-06T00:00:00.000Z", "2020-01-13T00:00:00.000Z", "2020-01-20T00:00:00.000Z", "2020-01-27T00:00:00.000Z", "2020-02-03T00:00:00.000Z", "2020-02-10T00:00:00.000Z", "2020-02-17T00:00:00.000Z", "2020-02-24T00:00:00.000Z", "2020-03-02T00:00:00.000Z", "2020-03-09T00:00:00.000Z", "2020-03-16T00:00:00.000Z", "2020-03-23T00:00:00.000Z", "2020-03-30T00:00:00.000Z", "2020-04-06T00:00:00.000Z", "2020-04-13T00:00:00.000Z", "2020-04-20T00:00:00.000Z", "2020-04-27T00:00:00.000Z", "2020-05-04T00:00:00.000Z"]

Я пытаюсь отсортировать сгруппированные данные, используя:

for (a in get_grouped) {
            cat.forEach(t => {
                if (!get_grouped[a].some(v => v.type == t)) {
                    get_grouped[a].push({
        "date": get_grouped[a][0].date,
        "metric": 0,
        "type": t
      });
    }
  });
  get_grouped[a].sort((a, b) => arr.indexOf(a.date)-arr.indexOf(b.date));
}

get_grouped:

    (3) [{…}, {…}, {…}]
0: {date: "2020-01-01", metric: 32, type: "Google"}
1: {date: "2020-01-01", metric: 24, type: "Bing"}
2: {date: "2020-01-01", metric: 0, type: "Jeeves"}
length: 3
__proto__: Array(0)
(index):98 
(3) [{…}, {…}, {…}]
0: {date: "2020-01-02", metric: 1, type: "Google"}
1: {date: "2020-01-02", metric: 0, type: "Bing"}
2: {date: "2020-01-02", metric: 32, type: "Jeeves"}
length: 3
__proto__: Array(0)
(index):98 
(3) [{…}, {…}, {…}]
0: {date: "2020-01-03", metric: 30, type: "Google"}
1: {date: "2020-01-03", metric: 24, type: "Bing"}
2: {date: "2020-01-03", metric: 0, type: "Jeeves"}

Эта сортировка отлично работает с cat - это массив струны. Как мне отсортировать его, если это массив дат ISO, как я показал выше? Как это сделать с помощью Moment JS?

1 Ответ

2 голосов
/ 07 мая 2020

Имея строки ISO 8601 , вы можете воспользоваться стандартным подходом с Array#sort, который сортируется по строке.

var array = ["2019-12-30T00:00:00.000Z", "2020-01-06T00:00:00.000Z", "2020-01-13T00:00:00.000Z", "2020-01-20T00:00:00.000Z", "2020-01-27T00:00:00.000Z", "2020-02-03T00:00:00.000Z", "2020-02-10T00:00:00.000Z", "2020-02-17T00:00:00.000Z", "2020-02-24T00:00:00.000Z", "2020-03-02T00:00:00.000Z", "2020-03-09T00:00:00.000Z", "2020-03-16T00:00:00.000Z", "2020-03-23T00:00:00.000Z", "2020-03-30T00:00:00.000Z", "2020-04-06T00:00:00.000Z", "2020-04-13T00:00:00.000Z", "2020-04-20T00:00:00.000Z", "2020-04-27T00:00:00.000Z", "2020-05-04T00:00:00.000Z"]

array.sort();

console.log(array);

Для сортировки по индексу c заданного массива дат вы можете взять объект с форматом, который соответствует структуре данных для сортировки, и принять индекс как значение для сортировки.

var array = ["2019-12-30T00:00:00.000Z", "2020-01-06T00:00:00.000Z", "2020-01-13T00:00:00.000Z", "2020-01-20T00:00:00.000Z", "2020-01-27T00:00:00.000Z", "2020-02-03T00:00:00.000Z", "2020-02-10T00:00:00.000Z", "2020-02-17T00:00:00.000Z", "2020-02-24T00:00:00.000Z", "2020-03-02T00:00:00.000Z", "2020-03-09T00:00:00.000Z", "2020-03-16T00:00:00.000Z", "2020-03-23T00:00:00.000Z", "2020-03-30T00:00:00.000Z", "2020-04-06T00:00:00.000Z", "2020-04-13T00:00:00.000Z", "2020-04-20T00:00:00.000Z", "2020-04-27T00:00:00.000Z", "2020-05-04T00:00:00.000Z"],
    indices = array.reduce((r, d, i) => (r[d.slice(0, 10)] = i + 1, r), {});

console.log(indices);

// for sorting take
// get_grouped[a].sort((a, b) => indices[a.date] - indices[b.date]);
...