请参阅最后的编辑以了解实际问题。
好吧,我有这样的场景:
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},...]
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 为 true,则必须返回 -1;否则返回 1。
为了防止隐式类型转换(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);
更简单的方法:
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() ..
编辑: 编辑以反映对对象数组而不是布尔数组进行排序的更新问题。
数组没有任何相等的位置,所以为什么不放弃等于检查,并始终返回 -1 或 1。这种方法非常适合 TS。
a.sort(x => x ? -1 : 1)
注意:我有点担心这会如何影响排序函数的内部,但它似乎可以解决问题。
如果你想反向排序
a.sort(x => !x ? -1 : 1)
简单的解决方案:
[true, false, true, false].sort((a, b) => b - a)
console.log([true, false, true, false].sort((a, b) => b - a));
你实际上可以这样做:
const sortedData = data.sort(
(a, b) => Number(b) - Number(a),
);
这个解决方案对于 Typescript 来说是可以的,因为布尔值到数字的转换是明确的。
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);
我也遇到了这个问题,这是我的部分,希望它有所帮助:
orders.sort((x, y) => {
if (x === y) return 0;
if (x) return -1;
return 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);
比较函数的一个非常简单的解决方案是检查是否
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
),这应该使其在任一排序方向上最后。
a=[true,false,true,false,true];
a.sort(function(x, y) {
a1=x?1:0
b1=y?1:0
return a1-b1
});
一个布尔数组,有足够的条目来表示所有转换,即 true 到 true、true 到 false、false 到 false、false 到 true。
var boolarray = [true, false, true, true, false, false, true]
boolarray.sort( (a,b) => !(a ^ b) ? 0 : a ? -1 : 1)
排序会反转输入的异或。如果输入相同则返回 0,如果不同则返回 0,如果 'a' 输入为 true 'b' 必须为 false,因此返回 -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)
我在
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;
});
不使用任何具有时间和空间优化的ES6函数 -
const data = [false, true, true, true, false, false, false, true];
let lastElementUnchecked;
for(let i=0; i<data.length; i++){
if(data[i] && lastElementUnchecked !== undefined){
let temp = data[i];
data[i] = data[lastElementUnchecked];
data[lastElementUnchecked] = temp;
i = lastElementUnchecked;
lastElementUnchecked = undefined;
}else{
if(!data[i] && lastElementUnchecked === undefined){
lastElementUnchecked = i;
}
}
}
console.log(data)
const arr = [{ bool: true }, { bool: false }, { bool: false }, { bool: true }];
// Sorting the array to place true values first
const trueValFirst = arr.sort((a, b) => {
// Converting boolean values to numbers and comparing them
const boolA = Number(a.bool);
const boolB = Number(b.bool);
// Sorting in descending order
return boolB - boolA;
});
console.log(trueValFirst);