【问题标题】:boolean sort for comparator in javascriptjavascript中比较器的布尔排序
【发布时间】:2018-08-26 06:45:12
【问题描述】:

我发现了以下布尔排序:

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

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

【问题讨论】:

  • 您不是在对布尔值进行排序,而是在对将被转换为布尔值的东西进行排序。
  • 所以你会有一方面是虚假的元素,另一方面是真实的元素
  • 请添加您喜欢排序的值。

标签: javascript arrays


【解决方案1】:

为什么不直接使用 - 运算符?

things = [{"current":true},{"current":false},{"current":true}]
things.sort((left, right) => left.current - right.current);
console.log(things);

- 将自动强制将两个操作数转换为Number。

【讨论】:

    【解决方案2】:

    您可以使用转换为布尔值的值的差异。

    减号运算符将两个操作数强制为数字并返回一个数值,该数值反映了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; }

    【讨论】:

    • 布尔值的使用在这里是错误的和误导的!这就是为什么 Boolean(true) 会给出 true 的原因; Boolean(false) 将给出 false; Boolean('true') 将给出 true; Boolean('false') 将给出 true; Boolean('anything') 将给出 true;和减号 (-) 将完美地工作没有布尔铸造,实际上根本没有铸造!
    • Boolean(true), Boolean(false) - O.o
    • 实际上,我不知道真正的价值,只知道!!,最好使用Boolean。
    • @surajrawat Boolean() 情况的症结在于它没有像其他语言传统上预期的那样进行解析/大小写。它像 if 语句一样评估表达式(在 JS 中大多数情况都是这样),并将结果作为布尔值返回。 'false' 是一个真实值,因此返回 true。只是想为提出问题的人提供更多信息。
    • @surajrawat,真的是这里的问题吗?
    【解决方案3】:

    是的,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(', '));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-01
      • 2011-10-02
      • 2021-12-06
      • 2019-05-28
      相关资源
      最近更新 更多