Как мне отсортировать массив строк численно с помощью Ramda?

#javascript #string #sorting #ramda.js

#javascript #строка #сортировка #ramda.js

Вопрос:

Я пытаюсь правильно отсортировать ключи следующего объекта:

 const data = {
  '0 - 4': [...],
  '5 - 9': [...],
  '10 - 14': [...],
  '15 - 19': [...],
};
 

Выполнив:

 const sort = R.sortBy(R.toLower);
return R.compose(sort, R.keys)(data);
 

Но это всегда заканчивается как:

 ['0 - 4', '10 - 14', '15 - 19', '5 - 9'];
 

Потому что он обрабатывает числа как строку, а строка, начинающаяся с 5, предположительно выше, чем строка, начинающаяся с 1. Кто-нибудь знает, как использовать Ramda для правильной сортировки этого, чтобы оно выглядело как

 ['0 - 4', '5 - 9', '10 - 14', '15 - 19'];
 

Ответ №1:

Вы можете использовать String.localCompare() с numeric: true опцией в функции comparator:

 const data = {
  '0 - 4': [],
  '5 - 9': [],
  '10 - 14': [],
  '15 - 19': [],
};

const sort = R.sort((a, b) => a.localeCompare(b, undefined, { numeric: true }));

const result = R.compose(sort, R.keys)(data);

console.log(result); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous"></script> 

И вот как вы могли бы это сделать без Ramda:

 const data = {
  '0 - 4': [],
  '5 - 9': [],
  '10 - 14': [],
  '15 - 19': [],
};

const fn = obj => 
  Object.keys(obj)
    .sort((a, b) => a.localeCompare(b, undefined, { numeric: true }));

const result = fn(data);

console.log(result); 

Ответ №2:

Используйте parseInt вместо R.toLower :

 const sort = R.sortBy(parseInt);
 

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

parseInt , с другой стороны, вернет номер левой части каждой строки (например parseInt('10 - 14') , это число 10 , а не строка), который затем будет использоваться sortBy для сортировки строк.

ДЕМОНСТРАЦИЯ:

 const data = {
  "10 - 14'": [],
  "5 - 9": [],
  "15 - 19": [],
  "0 - 4": []
};

const sort = R.sortBy(parseInt);
const result = R.compose(sort, R.keys)(data);

console.log(result); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous"></script>