巧妙的排序(对可能包含或不包含数字的字符串进行排序)

时间:2018-12-21 17:17:02

标签: javascript sorting natural-sort

我需要对可能包含或不包含数字的单位列表进行排序。

例如[“单元1”,“单元2”,...,“单元11”]。

大多数排序功能将对此排序: 单元1,单元11,单元2。.

但是我也可能遇到没有数字的情况。 [“ apt A”,“ apt B”,...,“ apt Z”]。

是否有任何聪明的解决方案可以对此进行正确排序:

第1单元,第2单元,...,第11单元。

apt A,apt B,...,apt Z。

2 个答案:

答案 0 :(得分:2)

鉴于注释中的说明,您可以将每个字符串除以/(\d+)/g并按结果字符串数组中的每个元素进行排序。将偶数索引视为字符串,将奇数索引视为数字:

const input = ['unit 11', 'unit 1', 'unit 2', 'apt 11', 'apt 1', 'apt 2', 'unit A', 'unit c', 'unit B', 'apt a', 'apt C', 'apt b'];

function customSort (a, b) {
  a = a.toUpperCase().split(/(\d+)/g);
  b = b.toUpperCase().split(/(\d+)/g);

  const length = Math.min(a.length, b.length);

  for (let i = 0; i < length; i++) {
    const cmp = (i % 2)
      ? a[i] - b[i]
      : -(a[i] < b[i]) || +(a[i] > b[i]);

    if (cmp) return cmp;
  }

  return a.length - b.length;
}

console.log(input.sort(customSort));

答案 1 :(得分:-3)

您给出的情况只是字符串,因此按字典顺序仍然适用。 这里不需要复杂,原生Array.sort函数可以正常工作。

["apt b", "apt a", "apt z"].sort() //apt a, apt b, apt z