Javascript按布尔属性排序对象数组

时间:2013-06-30 05:22:36

标签: javascript sorting

请参阅末尾的编辑以了解实际问题。

好的,我有这种情况:

a = [false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]

然后,如果我这样做:

a.sort(function(a,b){return !a && b});

它给了我这个:

[false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]

这种做法有点......但不完全...... :(

如何对此数组进行排序?

编辑:

如果你想知道我为什么不使用a.sort()是因为我的实际数组是对象,而不是像我发布的那样的普通数组。真实的元素看起来像[{xx:true},{xx:false},...]

11 个答案:

答案 0 :(得分:116)

a = [false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false];
    
    
    a.sort(function(x, y) {
        // true values first
        return (x === y)? 0 : x? -1 : 1;
        // false values first
        // return (x === y)? 0 : x? 1 : -1;
    });
    
    console.log(a);

当a和b都具有相同的值时,必须返回0,如果a为真,则返回-1,否则返回1。

答案 1 :(得分:25)

更简单的方法:

a = [{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false}];

a.sort(function(a,b){return a.xx-b.xx});

console.log(a);

你可以在sort()之后调用a.reverse(),如果你想要以另一种方式排序..

编辑: 编辑以反映排序对象数组而不是布尔数组的更新问题。

答案 2 :(得分:8)

简单的解决方案:

[true, false, true, false].sort( (a,b) => b - a)

答案 3 :(得分:4)

为防止隐式类型转换(类似TypeScript不喜欢的语言),您可以使用Number()将布尔值显式转换为数字:

a = [false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false];
a.sort(function(x, y) {
   return Number(x) - Number(y);
});
console.log(a);

或使用箭头功能:

a = [false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false];
a.sort((x, y) => Number(x) - Number(y));
console.log(a);

答案 4 :(得分:1)

PFB解决方案也适用于Typescript Angular 2,

  let a = [{aa:"1",xx:true},{aa:"10",xx:false},{aa:"2",xx:true},{aa:"11",xx:false},{aa:"3",xx:true},{aa:"12",xx:false},{aa:"4",xx:true},{aa:"13",xx:false},{aa:"5",xx:true},{aa:"14",xx:false},{aa:"6",xx:true},{aa:"15",xx:false},{aa:"7",xx:true},{aa:"16",xx:false},{aa:"8",xx:true},{aa:"17",xx:false},{aa:"9",xx:true},{aa:"18",xx:false}];

    //a.sort(function(a,b){return a.xx-b.xx});
    a.sort(function (x, y) {
        // true values first
        return (x.xx === y.xx) ? 0 : x ? -1 : 1;
        // false values first
        // return (x === y)? 0 : x? 1 : -1;
    });
    return JSON.stringify(a);

答案 5 :(得分:1)

一个数组没有相等的位置,所以为什么不放弃equals校验,总是返回-1或1。这种方法在TS上效果很好。

a.sort(x => x ? -1 : 1)

注意:我有点担心这如何影响sort函数的内部,但似乎可以解决问题。

如果要反向排序

a.sort(x => !x ? -1 : 1)

答案 6 :(得分:1)

我想看看是否可以不使用? :运算符就能做到这一点,只是为了好玩。

注意

这适用于所有可排序的数据类型(字符串,数字),而不仅仅是原始布尔值。我不确定这是否比? :更快,并且是否更令人费解。我只是厌倦有条件的,所以这只是个人喜好。

  var b = [false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
  .sort((a,b) => Number(a > b) * 2 - 1);

我可以将其转换为实用程序函数,并为其赋予一个有意义的名称:

  var sortOrder = {
    asc: (a,b) => Number(a > b) * 2 - 1,
    desc: (a,b) => Number(a < b) * 2 - 1
  }

这样我就可以:

  var b = [false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
  .sort(sortOrder.asc);

答案 7 :(得分:0)

比较函数的一个非常简单的解决方案是检查a < b,当转换为数字时,它给出0或1。然后我们想要将0映射到-1和1到1.为此,您可以乘以2然后减去1.

data.sort(function (a, b) {
  return (a < b) * 2 - 1
}

或只是

data.sort((a, b) => (a < b) * 2 - 1)

问题排序了!

如果您的任何值为null,则会将其视为false(null*2 === 0),而undefined的任何值都将变为NaNundefined*2 === NaN)这应该使它在任何一个排序方向上持续。

答案 8 :(得分:0)

我在return (x.xx === y.xx) ? 0 : x ? -1 : 1;上遇到打字稿错误

当您要对布尔属性进行排序时,这是我的解决方案

this.mediaList.sort( (a: MediaAutosubscriptionModel, b: MediaAutosubscriptionModel) => {
    let status1: number = a.status === StatusEnum.ACTIVE ? 1 : 0;
    let status2: number = b.status === StatusEnum.ACTIVE ? 1 : 0;
    let comparison: number = 0;
    let direction: number = this.sortDirection === SortDirectionsEnum.ASC ? -1 : 1;
    if (status1 > status2) {
        comparison = direction;
    } else if (status1 < status2) {
        comparison = -1 * direction;
    }
        return comparison;
    });

答案 9 :(得分:0)

a=[true,false,true,false,true];
 
a.sort(function(x, y) {
      a1=x?1:0
      b1=y?1:0
return a1-b1
    });

答案 10 :(得分:0)

我也遇到了这个问题,这是我的部分,希望对您有所帮助:

orders.sort((x, y) => {
   if (x === y) return 0;
   if (x) return -1;
   return 1;
});