乐趣区

关于javascript:算法题IP-地址和版本号排序

在我的项目中遇到一个问题,须要对 IP 地址进行排序:

let arr = ["10.3.72.160", "10.3.71.106", "10.3.71.102", "10.3.69.108"]

思路很简略,先实现一个比拟两个版本号的函数,而后作为数组 sort 办法的 compareFunction 传入。

function compare(a, b) {const a1 = a.split(".");
  const a2 = b.split(".");
  // IP 地址一共 4 位
  for (let n=0; n<4; n++) {const i = +a1[n];
    const j = +a2[n];
    if (i < j) return -1;
    else if (i > j) return 1;
  }
  return 0;
}
arr.sort(compare);

而后版本号排序有一点难度,因为版本号位数不固定。这里假如版本号最多三位,即版本号能够取 1-3 位:

const versions = [
    '0.5.1',
    '0.1.1',
    '2.3.3',
    '0.302.1',
    '4.2',
    '4.3.5',
    '4.3.4'
];

还是一样,先实现一个比拟两个版本号的函数,而后作为数组 sort 办法的 compareFunction 传入:

function compare(a, b) {const a1 = a.split(".");
  const a2 = b.split(".");
  // 版本号能够取 1-3 位
  // 位数有余就补零
  for (let n=0; n<3; n++) {const i = (n < a1.length) ? +a1[n] : 0;
    const j = (n < a2.length) ? +a2[n] : 0;
    if (i < j) return -1;
    else if (i > j) return 1;
  }
  return 0;
}
versions.sort(compare);

这里介绍一个小技巧,数组 sort 办法不传 compareFunction 实际上也能够排序:

["10.3.72.160", "10.3.71.106", "10.3.71.102", "10.3.69.108"].sort();
// ['10.3.69.108', '10.3.71.102', '10.3.71.106', '10.3.72.160']

依照 MDN 文档的说法,如果没有指明 compareFunction,那么元素会依照转换为的字符串的诸个字符的 Unicode 位点进行排序。

参考:

Array.prototype.sort() – MDN

退出移动版