2D 数组的默认排序是什么
What is the default sort for 2D arrays?
当使用Array.sort()时
我假设它需要第一个索引,但我想验证一下。
MDN参考没有说什么:
此 SO 帖子无关紧要。
对于此方法:(排序第一个索引将正常工作)。
$P.aZindex = function () {
var arr_2d = {},
elements = document.body.getElementsByTagName("*"),
element,
length,
z_index;
// loop through elements and pull information from them
$A.eachIndex(elements, function(val, index){
z_index = win.getComputedStyle(val).getPropertyValue("z-index");
// ignore elements with the auto value
if (z_index !== "auto") {
arr_2d[i] = [val.id, val.tagName, val.className, z_index];
}
});
// sort the array
arr_2d.sort();
return arr_2d;
};
让我们检查一下数组sort
方法的 EMCAScript 规范。sort
算法以迭代方式比较数组中的元素对;这些比较产生 -1
、1
或 0
(分别小于、大于或等于),并且每个比较的结果用于构建排序数组。
特别是,我们关注的是sort
的"默认"比较情况,其中没有指定比较函数。当比较一对x
和y
时:
- 设 xString 为 ToString(x)。
- 设 yString 为 ToString(y)。
- 如果 xString
- 如果 xString> yString,则返回 1。
- 返回 +0。
ECMAScript 的ToString
,当应用于对象时,调用对象的toString
方法。
为了澄清x > y
和x < y
的含义,我们可以检查 ECMAScript 的抽象关系比较算法,它指定了>
和<
运算符的行为。如果操作数px
和py
都是字符串:
- 设 k 为最小的非负整数,使得 px 内位置 k 处的字符与 py 中位置 k 处的字符不同...
- 设 m 为整数,它是 px 内位置 k 处字符的代码单位值。
- 设 n 为整数,它是 py 内位置 k 处字符的代码单位值。
- 如果 m
这是一个简单的字符串比较,基于字符串中第一个不同位置字符的 Unicode 代码单元值的比较。
如您所见,sort
算法将它包含的每个对象元素(使用元素的 toString
方法)字符串化,然后比较这些字符串以确定排序。我知道这对您来说似乎很奇怪:如果您的排序数组中只有数组元素,为什么不使用这些子数组的元素来确定排序?这仅仅是因为 EMCAScript 规范选择将潜在异构数组的默认元素比较保留为非常通用,因为任何类型的元素都可以呈现为字符串。
但是,如果数组下降行为是您想要的,则可以实现:
var compare_items = function(a,b) {
var result;
if(a instanceof Array && b instanceof Array) {
// iteratively compare items from each array
for(var i=0; i<Math.min(a.length,b.length); ++i) {
result = compare_items(a[i], b[i]);
if(result != 0) { return result; }
}
// if both arrays are equal so far, length is the determining factor
return a.length - b.length;
}
// if the items are both numbers, report their numeric relation
if(typeof a == "number" && typeof b == "number") {
return a - b;
}
// otherwise, fall back to strings
if(a.toString() == b.toString()) { return 0; }
return a.toString() > b.toString() ? 1 : -1;
}
然后,使用这个比较器功能,如 arr_2d.sort(compare_items);
.
这允许您对任意深度的 N 维数组进行排序。首先我们将a[0]...[0][0]
与b[0]...[0][0]
进行比较,然后a[0]...[0][1]
与b[0]...[0][1]
进行比较;然后,如果[0]...[0][*]
子数组证明相等,我们向上移动到 a[0]...[1][0]
,依此类推。比较不同维度的数组可能会产生不寻常的结果,因为可以将非数组与数组进行比较,后者比较每个操作数的字符串化形式。
请注意,如果您有异构数组,则此函数会产生奇怪的结果:[1, 2, 3, [1,2], [2,3]]
排序以[1, [1,2], 2, [2,3], 3]
。数组和非数组的排序相对正确,但数组以非直观的方式与非数组一起分散。
从您链接到的文档:
数组根据每个元素的字符串转换按字典顺序(按字典顺序)排序
这不会仅仅因为这些元素也是数组而改变。
- 这是什么 ==- javascript 运算符
- 我的单元测试选项是什么
- 打破承诺链的好方法是什么
- 2D 数组的默认排序是什么
- 这个排序函数内部的机制是什么
- Facebook发送日期的格式的名称是什么,以及在javascript中对该格式进行排序的最简单方法是什么
- 在MySQL,PHP或一般情况下排序时字符的优先级是什么
- 在 JavaScript 中合并多个排序对象数组的最有效方法是什么?
- 与compareFunction一起使用的排序方法背后的逻辑是什么
- 对我来说,以排序的方式检索这些信息的最佳方式是什么
- last_num在数组排序函数中指的是什么
- 通过在json对象的每个属性中找到的索引来排序json对象的最佳方法是什么?
- jQuery插件选项排序/嵌套的最佳实践是什么?
- 这是一个合法的快速排序实现吗?它的复杂性是什么?
- 关于函数定义和调用排序的最佳实践是什么?
- 在Immutable.js的Map中,按子对象的属性排序的正确方法是什么?
- 在javascript中排序时,新RegExp(filter,"i")中i的意义是什么
- 将排序保存到sql的最佳方法是什么?
- 使用javascript对元素列表进行分类/分组和排序的最佳方法是什么?
- document.cookie的排序顺序是什么