#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>