字符串排序,小说章节排序算法?

发布于 2022-09-12 03:03:18 字数 481 浏览 9 评论 0

需要将一个小说目录排序。

const list = ['小说A第19章', '小说A第20章', '小说A第9章', '111', '小说B第五章', '小说B第四章'];

console.log(
  list.sort((a, b) => {
    return a > b ? 1 : -1;
  })
);
// [ '111', '小说A第19章', '小说A第20章', '小说A第9章', '小说B第五章', '小说B第四章' ]

我想让上面输出:

[ '111', '小说A第9章', '小说A第19章', '小说A第20章', '小说B第四章',  '小说B第五章' ]

请问如何写呢?

'第五章' > '第四章'
// false

'第19章' > '第9章'
// false

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

翻了热茶 2022-09-19 03:03:18

中文数字转数字还挺麻烦的.
主要看第一个方法.
其余的实现很罗嗦.

即便这样,应该还有漏洞.先这样吧.

const list = ["小说A第19章", "小说A第20章", "小说A第9章", "111", '222',"小说B第一千四百零二章","小说B第十五章", "小说B第四十二章", "小说B第二章", "小说B第四百零二章"];


function cnNum2Number(cnNumStr) {
  const numList = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"];
  if (cnNumStr[0] === "十") cnNumStr = "一" + cnNumStr;
  const wTest = new RegExp(`([${numList.join("")}])万`);
  const qTest = new RegExp(`([${numList.join("")}])千`);
  const bTest = new RegExp(`([${numList.join("")}])百`);
  const sTest = new RegExp(`([${numList.join("")}])十`);
  const lTest = new RegExp(`([${numList.join("")}])

中文数字转数字还挺麻烦的.
主要看第一个方法.
其余的实现很罗嗦.

即便这样,应该还有漏洞.先这样吧.

); let m = null; const result = [wTest, qTest, bTest, sTest, lTest].map(t => (m = cnNumStr.match(t)) ? numList.indexOf(m[1]) : 0); return parseInt(result.join("")); } function book2Item(list) { const cnNum = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "百", "千", "万"]; return list.map(k => { if (!isNaN(parseInt(k))) { return { text: k, book: "", index: parseInt(k) }; } // 中文替换为数值 k = k.replace(new RegExp(`第([${cnNum.join("")}]+)章

中文数字转数字还挺麻烦的.
主要看第一个方法.
其余的实现很罗嗦.

即便这样,应该还有漏洞.先这样吧.

), (s, m) => s.replace(m, cnNum2Number(m))); const result = { text: k, book: k.match(/^小说(.*)第/)[1] }; if (/第(\d+)章$/.test(k)) { return { ...result, index: +RegExp.$1 }; } return result; }); } function sortArrMap(arr) { const map = {}; arr.forEach(it => { const list = map[it.book] || (map[it.book] = []); // if (!map[it.book]) return (map[it.book] = [it]); const index = list.findIndex(item => item.index > it.index); if (index === -1) return list.push(it); list.splice(index, 0, it); }); return map; } function sortBookList(list) { const itemList = book2Item(list) const map = sortArrMap(itemList) return Object.keys(map).sort().reduce((pre, key) => { return [...pre, ...map[key].map(i=>i.text)] }, []) } console.log(sortBookList(list));
自演自醉 2022-09-19 03:03:18

想法就是先提供一个 format 方法,把数值计算一下,比如说中文的 十五 替换成 15

然后分组,排序即可。

大概就是下面这个意思吧。
image.png

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文