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

在纯javascript中排序数组时的最佳实践,如果我必须将一个组发送到后面,javascript,Javascript,如果我有以下数组: [0, 1, 3, 0, 4, 2] 我想按升序排序,除了结尾需要的零: [1, 2, 3, 4, 0, 0] 请记住,对于此解决方案,我没有访问下划线或linq.js的权限。 我目前的解决方案是可行的,但感觉很重,很长,也不是很优雅。这是我的密码: function sortNumbers(numbers) { var zeroNumbers = []; var notZeroNumbers = [];

如果我有以下数组:

[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;
    }
函数排序编号(编号){
var zeroNumbers=[];
var notZeroNumbers=[];
对于(变量i=0;i
我可以改进此解决方案吗?

只需尝试一下

var输出=[0,1,3,0,4,2]。排序(函数(a,b){
a=a | | Number.MAX_SAFE_INTEGER;//如果a==0,则它将是一个假值,并将为a分配Number.MAX_SAFE_INTEGER
b=b | | Number.MAX_SAFE_整数;
返回a-b;
});

log(输出)
您可以为此使用sort,这需要一个闭包/回调

var sortedArray = [0, 1, 3, 0, 4, 2].sort(function(currentValue, nextValue) {
    if(currentValue === 0) {
        return 1;
    } else {
        return currentValue - nextValue;
    }
});
var-arr=[0,1,3,0,4,2,9,8,7,0];
arr.sort(功能(左、右){
返回左==right?0:(左===0?1:(左<右?-1:1));
});

console.log(arr)
另一种替代解决方案,使用
Array.sort
Array.splice
Array.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]

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

因为排序会对原始数组进行变异,所以排序数组时的最佳做法是首先克隆它

const sortedArray=[…数组].sort(/*可选比较函数*/)

作为今后使用数组的提示,您应该查看数组函数,如.map、.sort、.filter等。这是一篇很好的排序文章和一份big-o备忘单。我喜欢这个答案,它读起来既干净又清晰。不幸的是,据我所知,ie不支持MAX_SAFE_INTEGER,有点遗憾!为什么不使用
Infinity
来代替呢?这正是我的问题,也是我一直在寻找的答案。谢谢