有名なrana_kualuさんが、Zennに投稿していらっしゃる記事から。
アルゴリズムのせいで面接に落ちた
https://zenn.dev/rana_kualu/articles/efd74e8525ccab6c8474
rana_kualuさんは「不労所得で生きたい。」そうですので、Zennでは「¥サポートする」ができるみたいなので、みなさまヨロ。
そこにスタックオーバーフローの回答もリンクされています。
また、Zennで他の方の記事でもコード書いていらっしゃいました。
【Typescript】バージョン比較用関数について
https://zenn.dev/nekoniki/articles/c9c4584bc463e593cb94
私も書いておきます。
こだわってみたのは、バージョン番号にアルファベットが付属しているときにその大文字小文字も比較しているところです。これは紹介した上記の回答でも考慮されてない気がします。
動作確認はこちら。
https://jsbin.com/xofomudano/1/edit?html,js,console
コードはこれ。
const versions = [
'5.0.0.',
'1.3.0.9',
'0.2.0',
'3.1.2',
'0.1.6',
'5.0.0',
'3.3.3.3',
'3.3.3.3.3',
'3.10',
'0.2.0',
'0.2.0a',
'0.2.0aa',
'0.2.0AA',
'0.2.0Aa',
'0.2.0aA',
'0.2.0c',
'0.2.0b',
'0.2.0A',
'0.2.0C',
'0.2.0B',
'0.2.0.a',
'0.2.0.c',
'0.2.0.b',
'0.2.0.A',
'0.2.0.C',
'0.2.0.B',
'5.0.0.',
'5.0.0.0',
];
const output = [
'5.0.0.0',
'5.0.0.',
'5.0.0.',
'5.0.0',
'3.10',
'3.3.3.3.3',
'3.3.3.3',
'3.1.2',
'1.3.0.9',
'0.2.0C',
'0.2.0c',
'0.2.0B',
'0.2.0b',
'0.2.0AA',
'0.2.0Aa',
'0.2.0aA',
'0.2.0aa',
'0.2.0A',
'0.2.0a',
'0.2.0.C',
'0.2.0.c',
'0.2.0.B',
'0.2.0.b',
'0.2.0.A',
'0.2.0.a',
'0.2.0',
'0.2.0',
'0.1.6',
];
const sortVersions = (unsortedVersions) => {
const result = unsortedVersions.map(element=>element.split('.'));
result.sort(
(a, b) => {
const length = Math.min(a.length, b.length);
for (let i = 0; i < length; i += 1) {
const valueA = parseInt(a[i], 10);
const valueB = parseInt(b[i], 10);
if (valueA < valueB) { return -1; }
if (valueA > valueB) { return 1; }
if (a[i].toLowerCase() < b[i].toLowerCase()) { return -1; }
if (a[i].toLowerCase() > b[i].toLowerCase()) { return 1; }
if (a[i] < b[i]) { return 1; }
if (a[i] > b[i]) { return -1; }
}
if (a.length < b.length) { return -1; }
if (a.length > b.length) { return 1; }
return 0;
}
);
return result.map(element=>element.join('.')).reverse();
};
const sortedVersions = sortVersions(versions);
console.log(versions, sortedVersions, sortedVersions.join() === output.join());