JS - сортировать массив строк как даты - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть следующий массив:

let datas = ["nov/2018", "set/2018", "jan/2019", "dez/2018", "out/2018"]

, когда я выполняю

datas.sort()

он приказывает в алфавитном порядке, однако,Я должен заказать сначала по году, а затем по алфавиту.

["dez/2018", "jan/2019", "nov/2018", "out/2018", "set/2018"]

Тестируя сегодня, я пришел к следующей строке кода:

var datas = ["mar", "abr", "jan", "dez", "set", "mai", "jun", "out", "jul"];
var datas_corretas = ["jan", "fev", "mar", "abr", "mai", "jun", "jul", "ago", "set", "out", "nov", "dez"];
var result = [];

datas_corretas.forEach(function ordenar(element, index){
  var mes = datas.filter(function(valor){
  return valor == datas_corretas[index];
});
  result.push(mes[0]);
  for(element of result){
    if (element === undefined || element === null){
      result.pop(element);
    }
  }
});
console.log(result);

Таким образом, я могу отсортировать данные, но проблема в том, когда я использую их с годом

var datas = ["mar/2018", "abr/2018", "jan/2019", "dez/2018", "set/2018", "mai/2018", "jun/2018", "out/2018", "jul/2018"];

Кто-нибудь есть идеи, как я могу решить это?

Ответы [ 5 ]

0 голосов
/ 18 февраля 2019

Я должен упорядочить сначала по году, а затем по алфавиту.

Кажется, что ответы все сортируют месяц в хронологическом порядке, так что вот как отсортировать их по алфавиту.Разделите на месяц и год, затем сначала сравните годы, затем сравните месяцы, используя localeCompare .

let datas = ["nov/2018", "set/2018", "jan/2019", "dez/2018", "out/2018"]

datas.sort((a, b) => {
  let [amon, ayr] = a.split('/');
  let [bmon, byr] = b.split('/');
  return (ayr - byr) || amon.localeCompare(bmon);
});

console.log(datas);
0 голосов
/ 15 февраля 2019

это очень легко при преобразовании значения в числа и индекс.

Вот мой пример ниже.

var datas_corretas = ["jan", "fev", "mar", "abr", "mai", "jun", "jul", "ago", "set", "out", "nov", "dez"];

var datas = ["mar/2018", "abr/2018", "jan/2019", "dez/2018", "set/2018", "mai/2018", "jun/2018", "out/2018", "jul/2018"];

var result = datas.sort(function(a, b){
// index of the month
var aMonth = datas_corretas.indexOf(a.split("/")[0]);
// convert the year to number
var aYear = parseInt(a.split("/")[1]);

var bMonth = datas_corretas.indexOf(b.split("/")[0])
var bYear = parseInt(b.split("/")[1])

return aYear - bYear || aMonth - bMonth;
});

console.log(result)
0 голосов
/ 15 февраля 2019

Вы можете разбить даты и отсортировать сначала по году, а затем по индексу месяца.

var months = ["jan", "fev", "mar", "abr", "mai", "jun", "jul", "ago", "set", "out", "nov", "dez"],
    datas = ["nov/2018", "set/2018", "jan/2019", "dez/2018", "out/2018"];

datas.sort((a, b) => {
    var aa = a.split('/'),
        bb = b.split('/');
    return aa[1] - bb[1] || months.indexOf(aa[0]) - months.indexOf(bb[0]);
});

console.log(datas);

Для более быстрого доступа вы можете сохранить месяцы как объект.

var months = { jan: 1, fev: 2, mar: 3, abr: 4, mai: 5, jun: 6, jul:7, ago: 8, set: 9, out: 10, nov: 11, dez: 12 },
    datas = ["nov/2018", "set/2018", "jan/2019", "dez/2018", "out/2018"];

datas.sort((a, b) => {
    var aa = a.split('/'),
        bb = b.split('/');
    return aa[1] - bb[1] || months[aa[0]] - months[bb[0]];
});

console.log(datas);
0 голосов
/ 15 февраля 2019

TIL вы можете передать пользовательский компаратор в функцию sort javascript.Мы можем использовать это, чтобы написать нашу собственную логику сортировки, сравнивая сначала годы, а затем месяцы:

let datas = ["nov/2018", "set/2018", "jan/2019", "dez/2018", "out/2018"]
const orderedMonths = ["jan", "fev", "mar", "abr", "mai", "jun", "jul", "ago", "set", "out", "nov", "dez"];

datas.sort((a,b) => {
  var [montha,yeara] = a.split('/');
  var [monthb,yearb] = b.split('/');
  
  if (yeara > yearb) return 1;
  if (yearb > yeara) return -1;
  if (orderedMonths.indexOf(montha) > orderedMonths.indexOf(monthb)) return 1;
  if (orderedMonths.indexOf(monthb) > orderedMonths.indexOf(montha)) return -1;
  return 0;
});

console.log(datas);
0 голосов
/ 15 февраля 2019

однако я должен заказать сначала по году, а затем по алфавиту.

["dez/2018", "jan/2019", "nov/2018", "out/2018", "set/2018"]

Для достижения ожидаемого результата вы можете использовать .sort()дважды .split() при "/", .pop() и .shift()

datas.sort((a, b) => a.split("/").pop() < b.split("/").pop() ? -1 : 0)
.sort((a, b) => a.split("/").shift() < b.split("/").shift() ? -1 : 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...