我有一个数字数组的数组。
每个数字数组始终是一个升序序列,例如[8, 9, 10]
。
我想基于以下内容对每个数字数组进行排序:
例如,给出以下内容:
[
[1],
[2, 3],
[10],
[11, 12, 13],
[3, 4],
[2, 3, 4],
[1, 2, 3, 4, 5, 6],
[10, 11, 12],
[7, 8, 9],
[1, 2, 3],
[10, 11],
]
结果应为:
[
[1],
[1, 2, 3],
[1, 2, 3, 4, 5, 6],
[2, 3],
[2, 3, 4],
[3, 4],
[7, 8, 9],
[10],
[10, 11],
[10, 11, 12],
[11, 12, 13],
]
使用以下方法几乎可以达到结果:
arr.sort((a, b) => a[0] - b[0]);
但不完全是
这是我的示例代码:https : //repl.it/repls/MadeupMediumpurpleCavy
有没有一种方法可以使用Array.prototype.sort实现呢?
当前,您的代码仅通过调用sort的compareFunction查看每个数组的第一个元素来对数组进行排序:
const actual = difficulties.sort((a, b) => a[0] - b[0])
如果第一个元素的值相等,例如:
[2, 3, 4]
[2, 3]
期望的结果是保持它们与当前的顺序相同,但不要!通过一些不稳定的时间过时的wimey ...东西...在某些情况下,如果结果语句解析为0,则会切换它们。据我所知,这些实例是不可预测的,可能与特定的浏览器无关。
因此,此时我们在此处使用的排序函数的已知结果如下:
a[0] - b[0] < 0: do nothing
a[0] - b[0] = 0: undef (maybe move maybe not)
a[0] - b[0] > 0: move element b to before element a
话虽如此,如果数组(a和b)的第一个元素相同,就需要对范围进行排序。幸运的是,在您的数据集中,范围直接对应于数组的长度,因此它使事情变得更简单。
提到逻辑运算符并不一定要与javascript中的布尔值一起使用是一个很好的观点。也可以使用整数!使用与布尔值不同的数据类型,结果可能会变得有些混乱,但这在此特定示例中很重要:
唯一的整数是0!所有非0整数都是真实的。
所以...
如果第一个值是true,则OR短路,这意味着在这种情况下,如果left语句解析为非0,则OR语句返回该非0整数,并且不会继续评估右语句。
考虑以下:
a[0] - b[0] || a.length - b.length
使用示例数组:
[1, 2, 3]
[2, 3]
结果值将是:
a[0] = 1
b[0] = 2
a[0] - b[0] = -1
因此:
a[0] - b[0] || a.length - b.length
解析为-1 || 没关系(1)
-1为非0,因此此OR语句将-1返回到sort函数,该函数将元素保留在原处。
相对于以下情况:
[2, 3, 4]
[2, 3]
结果值将是:
a[0] = 2
b[0] = 2
a[0] - b[0] = 0
因此:
a[0] - b[0] || a.length - b.length
解析为0 || 1个
该OR语句返回1,因为0为false,而1为true。
1是一个正数,对于排序功能而言(如上所述)意味着将元素b置于元素a之后。
试图尽可能详细。希望这可以帮助!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句