FE-Interview icon indicating copy to clipboard operation
FE-Interview copied to clipboard

versions 是一个项目的版本号列表,因多人维护,不规则,动手实现一个版本号处理函数

Open lgwebdream opened this issue 5 years ago • 6 comments

var versions = ["1.45.0", "1.5", "6", "3.3.3.3.3.3.3"];
// 要求从小到大排序,注意'1.45'比'1.5'大
function sortVersion(versions) {
  // TODO
}
// => ['1.5','1.45.0','3.3.3.3.3.3','6']

lgwebdream avatar Jul 06 '20 15:07 lgwebdream

扫描下方二维码,获取答案以及详细解析,同时可解锁800+道前端面试题。

lgwebdream avatar Jul 06 '20 15:07 lgwebdream

var versions = ["1.45.0", "1.5", "6", "3.3.3.3.3.3.3"];
// 要求从小到大排序,注意'1.45'比'1.5'大
function sortVersion(versions) {
	if (!versions || !versions.length) return [];
	const result = versions.sort((a, b) => {
		const arrA = a.split('.'), arrB = b.split('.');
		const length = Math.max(a.length, b.length);
		for (let i = 0; i < length; i++) {
			const x = Number(arrA[i] || 0);
			const y = Number(arrB[i] || 0);
			if (x - y !== 0) return x - y;
		}
	});
	return result;
}
console.log(sortVersion(versions)); // [ '1.5', '1.45.0', '3.3.3.3.3.3.3', '6' ]

GolderBrother avatar Aug 30 '20 12:08 GolderBrother

function equalAndSwap(i, j, list) {
  let v1 = list[i]
  let v2 = list[j]
  let c = 0
  let temp
  while (c < v1.length && c < v2.length) {
    if (+v1[c] > +v2[c]) {
      temp = list[i]
      list[i] = list[j]
      list[j] = temp
      return
    }else if(+v1[c] === +v2[c]){
      c++
    }else{
      return
    }
  }
}

function sortVersion(versions) {
  versions = versions.map(v => v.split('.'))
  for (let i = 0; i < versions.length - 1; i++) {
    for (let j = i + 1; j < versions.length; j++) {
      equalAndSwap(i, j, versions)
    }
  }
  return versions
}

AAA611 avatar Aug 25 '22 10:08 AAA611

const sortVersion = (versions) => {
  const getMinVersion = (versions, index = 0) => {
    if (versions.length === 1) {
      return versions[0]
    }
    let min = versions[0].split('.')[index]
    let arr = []
    for (const value of versions) {
      const num = value.split('.')[index]
      if (min === num) {
        arr.push(value)
      } else if (+num < +min) {
        min = num
        arr = [value]
      }
    }
    return getMinVersion(arr, index + 1)
  }
  let index = 0
  const len = versions.length
  const res = []
  while (index < len) {
    const minVersion = getMinVersion(versions)
    res.push(minVersion)
    const i = versions.indexOf(minVersion)
    versions.splice(i, 1)
    index++
  }
  return res
}

DaphnisLi avatar May 22 '23 16:05 DaphnisLi


function sortVersion(source) {
  function splitVersion(version) {
    return version.split(".");
  }

  function compareVersionPair(versionA, versionB) {
    const [aDetail, bDetail] = [splitVersion(versionA), splitVersion(versionB)];

    let length = aDetail.length;
    let index = 0;

    console.log(`DEBUG: start to compare version pair [${versionA}, ${versionB}]`);

    while (index < length) {
      const currentVersionA = Number(aDetail[index]);
      const currentVersionB = Number(bDetail[index]);

      console.log(`DEBUG:
        currentVersionA: ${currentVersionA},
        currentVersionB: ${currentVersionB}`);

      if (!currentVersionB) {
        console.log(`Can not found detail version B, A > B`);
        return 1;
      }
      if (currentVersionA === currentVersionB) {
        console.log(`Current version A = version B`);
        index++;
        continue;
      }
      if (currentVersionA > currentVersionB) {
        console.log(`Current version A > current version B`);
        return 1;
      } else if (currentVersionB > currentVersionA) {
        console.log(`Current version A < current version B`);
        return -1;
      }
    }
    return 0;
  }

  source.sort(compareVersionPair);
  return source;
}

const sortedVersions = sortVersion(["1.45.0", "1.5", "6", "3.3.3.3.3.3.3"]);
console.log("sortedVersions", sortedVersions);
image

gaohan1994 avatar Apr 28 '24 08:04 gaohan1994