2D 数组的默认排序是什么

What is the default sort for 2D arrays?

本文关键字:排序 是什么 默认 数组 2D      更新时间:2023-09-26

当使用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算法以迭代方式比较数组中的元素对;这些比较产生 -110(分别小于、大于或等于),并且每个比较的结果用于构建排序数组。

特别是,我们关注的是sort的"默认"比较情况,其中没有指定比较函数。当比较一对xy时:

  • 设 xString 为 ToString(x)。
  • 设 yString 为 ToString(y)。
  • 如果 xString
  • 如果 xString> yString,则返回 1。
  • 返回 +0。

ECMAScript 的ToString,当应用于对象时,调用对象的toString方法。

为了澄清x > yx < y的含义,我们可以检查 ECMAScript 的抽象关系比较算法,它指定了><运算符的行为。如果操作数pxpy都是字符串:

  • 设 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]。数组和非数组的排序相对正确,但数组以非直观的方式与非数组一起分散。

从您链接到的文档:

数组根据每个元素的字符串转换按字典顺序(按字典顺序)排序

这不会仅仅因为这些元素也是数组而改变。