我找到了以下布尔类型:
const sorted = things.sort((left, right) => {
return Number(!!left.current) - Number(!!right.current);
});
这是排序布尔值的正确方法吗?
答案 0 :(得分:1)
为什么不只使用-
运算符?
things = [{"current":true},{"current":false},{"current":true}]
things.sort((left, right) => left.current - right.current);
console.log(things);
-
会自动强制 操作数到Number
。
答案 1 :(得分:0)
您可以使用值的差值,将其转换为布尔值。
减号运算符将两个操作数强制转换为数字并返回一个数值,该值反映了Array#sort
所需的顺序。
undefined
值are sorted to the end,永远不会用于排序回调。
var booleans = [0, true, 42, undefined, null, NaN, 'foo'];
booleans.sort((a, b) => Boolean(a) - Boolean(b)); // falsy values first
console.log(booleans);
booleans.sort((a, b) => Boolean(b) - Boolean(a)); // truthy values first
console.log(booleans);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 2 :(得分:0)
是的,JavaScript中对布尔数组进行排序的最佳比较器是负比较器,因为在这种情况下(数学过程),所有布尔(我们只有false
和true
)都将被转换为数字
您可以从 Array.sort() function的文档中阅读它:
compareFunction 可选
指定一个定义排序顺序的函数。如果省略,则根据每个字符的 Unicode代码点值和每个元素的字符串转换对数组进行排序。
它是一个Unicode代码点值,表示它是一个数字。
示例
我不得不提到,您不需要对Number(!!boolean)
之类的数字进行额外的强制转换。
// We need two arrays to see the difference between
// ascending and descending order because the returned
// array is sorted in place, and no copy is made.
var things1 = [true, false, true, false, true],
things2 = [true, false, true, false, true];
var sorted_AscendingOrder = things1.sort(function(left, right)
{
return left - right
});
var sorted_DescendingOrder = things2.sort(function(left, right)
{
return right - left
});
console.log(sorted_AscendingOrder.join(', '));
console.log(sorted_DescendingOrder.join(', '));
但是您可以对布尔数组进行排序,而无需任何比较器,如下所示:
var things3 = [true, false, true, false, true];
// in Ascending Order
console.log(things3.sort().join(', '));
var things4 = [true, false, true, false, true];
// in Descending Order
console.log(things4.sort().reverse().join(', '));