【问题标题】:Sorting lines by first numbers按第一个数字对行进行排序
【发布时间】:2020-11-18 04:46:57
【问题描述】:

leaderboard.txt 内容:

3, 503167934726311936
8, 737050574519967865
-10, 737050574519967865
23, 737050574519967865
19, 737050574519967865
-4, 737050574519967865
-14, 737050574519967865
27, 737050574519967865

未完成的javascript:

leaderboard = (fs.readFileSync('leaderboard.txt', 'utf-8'))
    //sorting leaderboard by number before comma
    fs.writeFileSync('leaderboard.txt', leaderboardSorted, 'utf8')

结果应该是这样的:

-14, 737050574519967865
-10, 737050574519967865
-4, 737050574519967865
3, 503167934726311936
8, 737050574519967865
19, 737050574519967865
23, 737050574519967865
27, 737050574519967865

【问题讨论】:

  • 欢迎来到 Stack Overflow!请使用tour(您将获得徽章!)并通读help center,尤其是How do I ask a good question? 您最好的选择是进行研究,search 以获取有关 SO 的相关主题,然后试一试. 如果您在进行更多研究和搜索后遇到困难并且无法摆脱困境,请发布您的尝试minimal reproducible example,并具体说明您遇到的问题。人们会很乐意提供帮助。
  • 还要准确解释您想要做什么,例如最终输出应该是什么样子以及您能想到的任何边缘情况。
  • @apena 我编辑了问题

标签: javascript sorting discord


【解决方案1】:

在您将split 添加到您的字符串输入并parseFloat'd 之后,您可以将自定义比较功能传递给sort 方法,该方法将仅比较每个项目的第一个元素。然后你可以join他们一起写回文件。

const leaderboard = "3, 503167934726311936\n8, 737050574519967865\n-10, 737050574519967865\n23, 737050574519967865\n19, 737050574519967865\n-4, 737050574519967865\n-14, 737050574519967865\n27, 737050574519967865" // same as readFileSync

const data = leaderboard.split('\n').map(item => item.split(', ').map(parseFloat))

data.sort(([score1, id1], [score2, id2]) => score1 > score2 ? 1 : score1 < score2 ? -1 : 0)

leaderboardSorted = data.map(item => item.join(' ,')).join('\n')

console.log(leaderboardSorted)

【讨论】:

  • 我刚刚意识到最后 2 位数字总是四舍五入的。你知道为什么吗?
  • 普通浮点数 JS 可以容纳的最大数字是 `Number.MAX_SAFE_INTEGER`,或 9007199254740991。基本上任何超过 10 位数的精度都会变得混乱。考虑另一种存储数据的方式,您可能可以将其存储为字符串,或者您不需要那么精确。或查看 bigint:stackoverflow.com/questions/30678303/…
  • 决定把中间的ID切片,以后再连接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-30
  • 2011-11-04
相关资源
最近更新 更多