订购以级别表示的文档或列表的编号:1.0,1.1.2,2.0.5.2.7
#javascript #数组 #sorting

我今天学到了什么? 通常使用点的方法订购文档:
2.1.3

当我们看到此编号时,我们将这些基本数字转换为序数:实际上,我们读了类似的东西 第二章的第一个字幕的第三段
在更多情况下,我们必须考虑我们有类型的案例
2.2
因此缺少编号的第三个组成部分,因为这是0的。

标准化构成编号的零件

我在Internet上寻找risorse的解决方案是首先将所有零件数量归一化,以便我们始终具有相同的评估数字。
然后从
切换

1.3.5
2.1
5.3.5.6
10

a

1.3.5.0
5.3.5.6
2.1.0.0
10.0.0.0

通过增加表达数量的价值而使数字的位置无关紧要

为了避免10个小于2,就像字母数字系统一样,化妆是通过添加我们期望最好的数字来增加构成编号的数字。例如,始终在我们得到的每个部分中添加100个:

101.103.105.100
105.103.105.106
102.101.100.100
110.100.100.100

尽管用数字表达了我们所拥有的,但我们将其作为字符串评估,因为它大大简化了比较,还允许您管理包含字母的数字。例如,我们可以拥有

7.1.b
7.2

变成

107.101.10b.100
107.102.100.100

实现此算法的代码我写了

// considerando che si possa arrivare ad una numerazione di centinaia
const templatePart = '1000';
// numerazione composta da 6 livelli di annidamento
const template = [templatePart, templatePart, templatePart, templatePart, templatePart, templatePart];
const convertForComparing = (parNumeration: string) => {
  // "somma" del numero template
  let parts = parNumeration.split('.').map(
    (p) => templatePart.substring(0, templatePart.length - p.length) + p);
  // normalizzazione del numero di parti
  parts = [...parts, ...template.slice(parts.length)];
  return parts.join('.');
};

const sortByParagraphNumeration = (a: Item, b: Item) => {
  const pa = convertForComparing(a.par.toLowerCase() || '');
  const pb = convertForComparing(b.par.toLowerCase() || '');

  if (pa < pb) {
    return -1;
  }
  if (pa > pb) {
    return 1;
  }
  return 0;
};

的解释肯定缺乏形式主义,而且经验都太过经验,但在我的情况下似乎可以正常工作。
您将如何解决?