gpt4 book ai didi

javascript - 为什么使用排序函数时正数会导致元素不切换?

转载 作者:行者123 更新时间:2023-11-30 08:20:27 24 4
gpt4 key购买 nike

我想我对 JS 排序的工作原理以及比较函数如何使用从它返回的正数和负数有点困惑。我有这段代码:

const stripCommas = value =>
typeof value === "string" ? value.replace(/,/g, "") : value;

const compareStringNumbersWithCommasAndStrings = (option1, option2) =>
isNaN(stripCommas(option2)) - isNaN(stripCommas(option1)) ||
stripCommas(option1) - stripCommas(option2);

和这个数组:

var array = ["full", "no", '1,000', '3,000', 2, "may", 0]

当它运行时,这是结果:

array.sort(compareStringNumbersWithCommasAndStrings)
=> [ 'full', 'no', 'may', 0, 2, '1,000', '3,000' ]

因此,当“full”和“no”传递到 compareStringNumnbersWithCommasAndStrings 时功能,都是NaN所以我们得到 true - true这是 === 0所以我们得到 0 || NaN计算结果为 NaN这显然在排序函数中等同于 0,因此元素不会改变。我明白了。

但是当我们到达 no1,000 ,比较函数将执行 true - false|| 之前的第一部分计算结果为 1然后 no - 1000计算结果为 NaN那么1 || NaN评估为 1所以两者不应该互换吗?结果为正时排序不切换吗?正数意味着传递给排序的第一个选项的索引将高于第二个正确的索引?

在幕后,这是什么样的?进行了多少次比较?

最佳答案

But when we get to no and 1,000, the compare function will do true - false in the first part before the || which evaluates to 1 and then no - 1000 which evaluates to NaN so then 1 || NaN evaluates to 1 so shouldn't the two switch?

没有,因为你在做

isNaN(stripCommas(option2)) - isNaN(stripCommas(option1))
// ^ ^

代替

isNaN(stripCommas(option1)) - isNaN(stripCommas(option2))

所以实际上它的计算结果为 -1,这会导致将字符串放在数字之前。更改减法顺序,字符串将向末尾排序。

Under the hood, what kind of sort is this? How many compares are being made?

参见 Javascript Array.sort implementation?为此。

关于javascript - 为什么使用排序函数时正数会导致元素不切换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54369475/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com