123

有关实际问题,请参阅最后的编辑。

好的,我有这种情况:

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},...]

4

12 回答 12

285

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。

于 2013-06-30T05:26:16.887 回答
48

为了防止隐式类型转换(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);

于 2018-03-20T13:13:30.813 回答
47

更简单的方法:

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() 。

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

于 2013-06-30T05:35:10.873 回答
22

数组没有任何相等的位置,所以为什么不放弃等号检查,总是返回 -1 或 1。这种方法适用于 TS。

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

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

如果你想反向排序

a.sort(x => !x ? -1 : 1)
于 2018-10-05T13:20:41.377 回答
21

简单的解决方案:

[true, false, true, false].sort( (a,b) => b - a)
于 2018-04-18T09:28:05.323 回答
3

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);
于 2017-05-16T12:20:03.923 回答
2

我想看看我是否可以在不使用? :操作员的情况下做到这一点,只是为了好玩。

笔记

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

  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);
于 2020-05-10T18:58:15.763 回答
2

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

orders.sort((x, y) => {
   if (x === y) return 0;
   if (x) return -1;
   return 1;
});
于 2021-06-17T12:55:53.363 回答
1

比较函数的一个非常简单的解决方案是检查 if 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将成为NaN( undefined*2 === NaN) 的值都应使其在任一排序方向上保持不变。

于 2018-04-09T23:47:24.263 回答
1
a=[true,false,true,false,true];
 
a.sort(function(x, y) {
      a1=x?1:0
      b1=y?1:0
return a1-b1
    });
于 2021-03-17T08:23:20.350 回答
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;
    });
于 2020-03-10T10:07:07.340 回答
0

一个布尔数组,具有足够的条目来表示所有转换,即真到真、真到假、假到假、假到真。

var boolarray = [true, false, true, true, false, false, true]
boolarray.sort( (a,b) => !(a ^ b) ? 0 : a ? -1 : 1)

排序反转输入的异或。如果输入相同则返回 0,否则返回 0,如果不是,则如果“a”输入为真,“b”必须为假,因此返回 -1,反之亦然返回 1。

'a' 和 'b' 布尔值在它们不同时排序,在相同时被忽略。

要将此方法用于对象,只需将对象成员名称用于排序参数:

var objarray = [{xx:true}, {xx:false}, {xx:true}, {xx:true}, {xx:false}, {xx:false}, {xx:true}]
objarray.sort( (a,b) => !(a.xx ^ b.xx) ? 0 : a.xx ? -1 : 1)
于 2022-01-07T17:49:05.967 回答