按升序对对象数组进行排序,但将所有零放在最后

时间:2018-06-19 16:32:44

标签: javascript

如果我有一个对象数组:

[{
    val: 0
}, {
    val: 1
}, {
    val: 0
}, {
    val: 3
}]

如何按升序对其进行排序,但是将零都保留在末尾,就像这样:

[{val:1}, {val:3}, {val: 0},{val: 0}]

按预期排序,将零放在顶部。即使我添加了将零排序到最后的逻辑:

array.sort((a,b) => {
    if (a.val === 0 || b.val === 0) return 1;
    return a.val < b.val;
});

4 个答案:

答案 0 :(得分:5)

如果a.val为0,则返回1。如果b.val为0,则返回-1

var array = [{val: 0}, {val: 1}, {val: 0}, {val: 3}];

array.sort((a, b) => {
  if (a.val === 0) return 1;        //Return 1 so that b goes first
  if (b.val === 0) return -1;       //Return -1 so that a goes first
  return a.val - b.val;
});

console.log(array);

答案 1 :(得分:2)

您可以检查零,然后将此值移到底部,然后按值排序。

var array = [{ val: 0 }, { val: 1 }, { val: 0 }, { val: 3 }];

array.sort((a, b) => (a.val === 0) - (b.val === 0) || a.val - b.val);

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:0)

只需过滤掉零和非零数组,对非零数组进行排序并同时合并。

尝试以下操作:

var arr = [{
    val: 0
}, {
    val: 1
}, {
    val: 0
}, {
    val: 3
}];
var nonZero = arr.filter((a)=>a.val !== 0);
var zeroArray = arr.filter((a)=>a.val === 0);
nonZero.sort((a,b)=>(a.val -b.val));
arr = nonZero.concat(zeroArray);
console.log(arr);

答案 3 :(得分:0)

定义比较器。如果元素为0,则将其视为更大。您不能同时为a == 0和b == 0返回1。