Как вы можете сравнить значение «неделя-год» в JS? - PullRequest
0 голосов
/ 20 сентября 2018

Например, у меня есть следующие значения String в формате недели-года:

// week-year
"8-18" < "9-18"   // returns true
"8-18" < "10-18"  // returns false but should return true
"8-18" < "4-18"   // returns false but should be true

Я должен отсортировать массив массивов со значениями "неделя-год" для целей планирования.В настоящее время я использую array.sort для достижения этой цели:

var results = [
  [ 
    { weekyear:"4-18" } 
  ], 
  [
    { weekyear:"5-18" }
  ], 
  [
    { weekyear: "1-19" }
  ] ... ]

results.sort((function (index) { // Sort based on Week-Year in descending order 
  return function (a, b) {
    return (a[index].weekyear === b[index].weekyear ? 0 : (a[index].weekyear< b[index].weekyear ? -1 : 1));
  };
})(0));

Можно ли как-нибудь изменить значение week-year в числовое значение, которое позволяет сортировать?

Приведенная выше сортировка должна привести меня в порядок:

"1-19" , "5-18" , "4-18"

1 Ответ

0 голосов
/ 20 сентября 2018

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

function getYearWeek(weekYear) {
    return weekYear
        .split('-')
        .map(s => s.padStart(2, '0'))
        .reverse()
        .join('-W');
}

var results = [{ weekyear: "4-20" }, { weekyear: "5-18" }, { weekyear: "4-18" }, { weekyear: "1-19" }];

console.log(getYearWeek("8-18") < getYearWeek("9-18"));  // true
console.log(getYearWeek("8-18") < getYearWeek("10-18")); // true
console.log(getYearWeek("8-18") < getYearWeek("4-18"));  // false

results.sort((a, b) => 
    getYearWeek(a.weekyear).localeCompare(getYearWeek(b.weekyear)));

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