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

PCo*_*lho 56 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]
Run Code Online (Sandbox Code Playgroud)

如果我这样做:

a.sort(function(a,b){return !a && b});
Run Code Online (Sandbox Code Playgroud)

它给了我这个:

[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]
Run Code Online (Sandbox Code Playgroud)

这有点......但不完全...... :(

我该如何排序这个数组?

编辑:

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

c.P*_*.u1 144

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);
Run Code Online (Sandbox Code Playgroud)

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

  • 更短:a.sort(function(x,y){return y - x}); (25认同)
  • @AdamMoisa Joe的解决方案因为类型强制而出现.基本上,JS引擎会注意到你试图对`boolean`值进行数学运算(减法),所以它会将`false`转换为'0`而将`true`转换为`1`. (4认同)
  • @PCoelho,考虑使用乔的解决方案。它有效并且更简洁。 (2认同)
  • @JoeFrambach你能解释一下它是如何工作的,还是指向一个解释类似语法的线程? (2认同)

dan*_*vis 28

一种更简单的方法:

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);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 太好了,如果您希望以另一种方式排序,请在排序函数中交换“a”和“b”的位置,而不是调用“reverse()”。 (3认同)

Cap*_*apK 15

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

a.sort(x => x ? -1 : 1)
Run Code Online (Sandbox Code Playgroud)

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

如果你想反向排序

a.sort(x => !x ? -1 : 1)
Run Code Online (Sandbox Code Playgroud)

  • 完美的解决方案,我喜欢你的简约方法 (2认同)
  • 在对对象进行排序的情况下,此方法不能保证具有相同属性值(即“a.xx === b.xx”)的对象彼此保持相同的顺序。 (2认同)

Сер*_*ник 9

简单方案:

[true, false, true, false].sort( (a,b) => b - a)
Run Code Online (Sandbox Code Playgroud)


sro*_*oes 7

为了防止隐式类型转换(像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);
Run Code Online (Sandbox Code Playgroud)

或使用箭头功能:

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);
Run Code Online (Sandbox Code Playgroud)

  • 一个警告:此排序比较函数不适用于输入数组中的“未定义”值 (4认同)