在数组上使用Javascript.sort()将所有零放在末尾

在数组上使用Javascript.sort()将所有零放在末尾,javascript,arrays,sorting,Javascript,Arrays,Sorting,我正在尝试对数组进行排序,以便所有的零都位于末尾。但是,我不希望列表按数字排序,所有零以上的数字应该保持相同的顺序。以下是到目前为止我得到的信息: function placeZerosAtEnd(arr) { return arr.sort(compareForSort); } function compareForSort(first, second) { return first == 0 ? 1 : 0; } placeZerosAtEnd([9,0,9,1,0,2,0,

我正在尝试对数组进行排序,以便所有的零都位于末尾。但是,我不希望列表按数字排序,所有零以上的数字应该保持相同的顺序。以下是到目前为止我得到的信息:

function placeZerosAtEnd(arr) {
    return arr.sort(compareForSort);
}
function compareForSort(first, second) {
    return first == 0 ? 1 : 0;
}
placeZerosAtEnd([9,0,9,1,0,2,0,1,1,0,3,0,1,9,9,0,0,0,0,0]);
这应该返回[9,9,1,2,1,1,3,1,9,0,0,0,0,0,0,0,0,0,0],但实际返回[3,9,9,1,9,2,9,1,1,1,0,0,0,0,0,0,0,0]。零是正确的,但其他数字的顺序很奇怪。这是怎么回事


在您的示例中,
sort
函数正是它的本意

您期望的是
稳定排序
,但javascript排序算法不能保证稳定排序


有关javascript中稳定排序的讨论,请参阅。

我认为使用
sort
函数无法实现这一点。根据浏览器使用的排序方法(快速排序、合并排序等),
sort
功能通过将项目交换到位来工作。所以不知道非零会在哪里结束。。。您的算法只是确保它们出现在0之前

这里有一个函数可以完成您正在尝试的功能:

function placeZerosAtEnd(arr) {
  for(var i = 0 ; i < arr.length ; i++) {
    if(arr[i]===0) arr.splice(arr.length-1, 0, arr.splice(i, 1)[0]);
  }
  return arr;
}
函数placeZerosAtEnd(arr){
对于(变量i=0;i
正如其他人所说,在本例中使用.sort()是错误的。这是我最后使用的代码,正如elclanrs在我最初的帖子下面的评论中所建议的那样

function placeZerosAtEnd(arr) {
    return arr.filter(isntZero).concat(arr.filter(isZero));
}
function isntZero(element) {
    return element > 0;
}
function isZero(element) {
    return element == 0;
}

你也可以用这种方法

let listSort=[9,0,9,1,0,2,0,1,1,0,3,0,1,9,9,0,0,0,0,0],
isntZero=[],
isZero=[]
for(设i=0;iconsole.log(JSON.stringify(output))
使用排序的简单解决方案:
将零与非零进行“向下冒泡”:

[9,0,9,1,0,2,0,1,1,0,3,0,1,9,9,0,0,0,0,0].sort((a, b) => {
  if (a !== 0 && b === 0) return -1;
  if (a === 0 && b !== 0) return 1;
  return 0;
})

// [9, 9, 1, 2, 1, 1, 3, 1, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

您可以使用arr.sort来解决此问题

参考:


我猜这是因为快速排序(“分而治之”)所以它是一种排序算法行为。你可以做
xs.filter(isntZero)。concat(xs.filter(isZero))
谢谢@elclars很好的解决方案。我用你的小提琴得到了预期的结果。您是否也尝试过处理
second
0
的情况?
   function placeZerosAtEnd(arr) {

     arr.sort(function(key1,key2) {

      if (key1 == 0 ) return 1;
      return -1;
    });    
    return arr;
  }