在纯javascript中排序数组时的最佳实践,如果我必须将一组发送到后面

Best practice when sorting an array in pure javascript, if I have to send one group to the back

本文关键字:一组 数组 排序 javascript 最佳 如果 在纯      更新时间:2023-09-26

如果我有以下数组:

[0, 1, 3, 0, 4, 2]

我想对它进行升序排序,除了末尾需要的零:

[1, 2, 3, 4, 0, 0]

请记住,对于这个解决方案,我没有访问下划线或linq.js。我目前的解决方案可以工作,但感觉相当沉重、冗长,而且不是很优雅。下面是我的代码:

        function sortNumbers(numbers) {
        var zeroNumbers = [];
        var notZeroNumbers = [];
        for (var i = 0; i < numbers.length; i++) {
            if (numbers[i] === 0) {
                zeroNumbers.push(numbers[i]);
            } else {
                notZeroNumbers.push(numbers[i]);
            }
        }
        var sortedNumbers = notZeroNumbers.sort(function (a, b) {
            return parseFloat(a) - parseFloat(b);
        });
        for (var x = 0; x < zeroNumbers.length; x++) {
            sortedNumbers.push(zeroNumbers[x]);
        }
        return sortedNumbers;
    }

我可以改进这个解决方案吗?

这与这个问题无关,但我正在搜索"纯排序javascript",这是第一个答案。

因为sort会改变原始数组,所以排序数组时的最佳实践是先克隆它。

const sortedArray = [...array].sort(/* optional comparison function*/)

simple try

var output = [0, 1, 3, 0, 4, 2].sort(function(a, b) {
  a = a || Number.MAX_SAFE_INTEGER; //if a == 0 then it will be a falsey value and a will be assigned Number.MAX_SAFE_INTEGER
  b = b || Number.MAX_SAFE_INTEGER;
  return a - b;
});
console.log(output)

var arr = [0, 1, 3, 0, 4, 2, 9, 8, 7, 0];
arr.sort(function (left, right) {
       return left == right ? 0 : (left === 0 ? 1 : (left < right ? -1 : 1));
});
console.log(arr)

无论数字的大小,这将始终在末尾放置0。

使用Array.sort, Array.spliceArray.push函数的另一种替代方案:

var arr = [0, 1, 3, 0, 4, 2];
arr.sort();
while(arr[0] === 0) { arr.splice(0,1); arr.push(0); }
console.log(arr);  // [1, 2, 3, 4, 0, 0]

您可以使用sort,它接受闭包/回调。

var sortedArray = [0, 1, 3, 0, 4, 2].sort(function(currentValue, nextValue) {
    if(currentValue === 0) {
        return 1;
    } else {
        return currentValue - nextValue;
    }
});