在数组上使用Javascript .sort()将所有零都放在最后

时间:2014-09-23 23:04:39

标签: 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,1,1,0,3,0,1,9,9,0,0,0,0,0]);

这应该返回[9,9,1,2,1,1,3,1,9,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,0,0]。零是正确的,但其他数字是奇怪的顺序。这是怎么回事?

http://jsfiddle.net/v67fx4zk/

6 个答案:

答案 0 :(得分:3)

正如其他人所说,在这种情况下使用.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;
}

答案 1 :(得分:2)

我认为您无法使用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;
}

答案 2 :(得分:0)

在您的示例中,sort函数正在完成它的意图。

您期望stable sort,但javascript排序算法无法保证稳定排序。

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

答案 3 :(得分:0)

你也可以用某种方式

 var isntZero = []
    var isZero =[]
    for (var i = 0; i < this.listSort.length; i++) { 
      if(this.listSort[i] == 0){
        isZero.push(this.listSort[i]) 
      }else{
        isntZero.push(this.listSort[i])
      }
    }
    this.listSort = isntZero.concat(isZero)

答案 4 :(得分:0)

使用sort的简单解决方案:将气泡“冒泡”到非零:

[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]

答案 5 :(得分:0)

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

参考: Array.sort

   function placeZerosAtEnd(arr) {

     arr.sort(function(key1,key2) {

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