使用Array.sort()
时我认为它需要第一个索引,但我想验证。
MDN reference没有说什么:
此SO Post无效。
对于这个方法:(排序第一个索引可以正常工作)。
$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;
};
答案 0 :(得分:2)
让我们检查数组sort
method的EMCAScript规范。 sort
算法迭代地比较数组中的元素对;这些比较产生-1
,1
或0
(分别小于,大于或等于),每次比较的结果用于构建排序数组
特别是,我们关注sort
的“默认”比较情况,其中没有指定比较函数。比较某对x
和y
:
- 让xString为ToString(x)。
- 让yString为ToString(y)。
- 如果xString< yString,返回-1。
- 如果xString> yString,返回1.
- 返回+0。
ECMAScript的ToString
,当应用于对象时,会调用对象的toString
方法。
为了澄清x > y
和x < y
的含义,我们可以检查ECMAScript的Abstract Relational Comparison Algorithm,它指定了>
和<
运算符的行为。如果操作数px
和py
都是字符串:
- 设k为最小的非负整数,使得px内位置k处的字符与py内位置k处的字符不同...
- 设m是整数,它是px内位置k处字符的代码单位值。
- 设n是整数,它是py中位置k处字符的代码单位值。
- 如果m < n,返回true。否则,返回false。
这是一个简单的字符串比较,基于字符串中第一个不同位置的字符的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]
。数组和非数组是相对正确排序的,但是数组以非直观的方式分散在非数组中。
答案 1 :(得分:1)
从您链接的文档:
根据每个元素的字符串转换
按字典顺序(按字典顺序)对数组进行排序
这不会因为这些元素也是数组而改变。