Как отсортировать диапазоны долларовых чисел в JavaScript - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь отсортировать долларовые диапазоны в JavaScript.Проблема в том, что значения ответов упорядочены следующим образом:

['$10,000 - $29,999', '$30,000 - $49,999', '$5,000 - $9,999', '$50,000+', 'Lower than $5,000']

needs to be sorted to

['Lower than $5,000', '$5,000 -$9,999', '$10,000 - $29,999', '$30,000 - $49,999', '$50,000+']

Я бы хотел отсортировать их в порядке возрастания следующим образом, но я также хотел бы, чтобы он был устойчивым в том смысле, что если API когда-либо изменитсяВ порядке, в котором они отправляют эти данные, он по-прежнему поддерживает ту же сортировку:

Есть ли способ сделать это без жесткого кодирования алгоритма сортировки?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2019

Ну, вы можете попробовать это:

    let r = ['$10,000 - $29,999', '$30,000 - $49,999', '$5,000 - $9,999', '$50,000+', 'Lower than $5,000'];

    r.sort((a, b) => {
      return parseInt(a.match(/\$\d+,\d+/gi).pop().replace(/\D/gi, ""), 10) - parseInt(b.match(/\$\d+,\d+/gi).pop().replace(/\D/gi, ""), 10);
    });
    console.log(r);

Объяснение :

  1. Удаление каждого символа, который не является цифрой
  2. Разобрать его вчисло
  3. Сравнить

Редактировать :

Я отредактировал свой код в ответ на комментарий (язнаю, что это не самый красивый код, но он работает)

1 голос
/ 03 апреля 2019

Если ваш ranges будет сохранен во времени, вы можете создать объект, чтобы поддерживать связь между ranges и назначенным ордером.Затем вы можете использовать этот объект в методе Array.sort () :

const rangeOrder = {
  'Lower than $5,000': 0,
  '$5,000 - $9,999': 1,
  '$10,000 - $29,999': 2,
  '$30,000 - $49,999': 3,
  '$50,000+': 4,  
}

let input =  ['$10,000 - $29,999', '$30,000 - $49,999', '$5,000 - $9,999', '$50,000+', 'Lower than $5,000'];

console.log(input.sort(
  (a, b) => rangeOrder[a] - rangeOrder[b]
));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

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

let input =  ['$10,000 - $29,999', '$30,000 - $49,999', '$5,000 - $9,999', '$50,000+', 'Lower than $5,000'];

const matchValue = (str) =>
{
    let matches = str.match(/\d+,\d+/g);
    let maxVal = matches.length > 1 ? matches[1] : matches[0];
    return +(maxVal.replace(",", ""));
}

input.sort((a, b) => matchValue(a) - matchValue(b));
console.log(input);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...