如何使用 Ramda 对字符串数组进行数字排序?

3
我正在尝试正确排序以下对象的键:
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'];
2个回答

3
你可以在比较函数中使用 String.localCompare()numeric: true 选项来进行比较:

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);


1
使用 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>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接