javascript中比较器的布尔排序

时间:2018-05-29 07:43:48

标签: javascript arrays

我找到了以下布尔类型:

  const sorted = things.sort((left, right) => {
    return Number(!!left.current) - Number(!!right.current);
  });

这是排序布尔值的正确方法吗?

3 个答案:

答案 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所需的顺序。

undefinedare 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中对布尔数组进行排序的最佳比较器是负比较器,因为在这种情况下(数学过程),所有布尔(我们只有falsetrue)都将被转换为数字

您可以从 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(', '));