2D阵列的默认排序是什么?

时间:2013-11-06 14:49:32

标签: javascript sorting

使用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;
};

2 个答案:

答案 0 :(得分:2)

让我们检查数组sort method的EMCAScript规范。 sort算法迭代地比较数组中的元素对;这些比较产生-110(分别小于,大于或等于),每次比较的结果用于构建排序数组

特别是,我们关注sort的“默认”比较情况,其中没有指定比较函数。比较某对xy

  
      
  • 让xString为ToString(x)。
  •   
  • 让yString为ToString(y)。
  •   
  • 如果xString< yString,返回-1。
  •   
  • 如果xString> yString,返回1.
  •   
  • 返回+0。
  •   

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

为了澄清x > yx < y的含义,我们可以检查ECMAScript的Abstract Relational Comparison Algorithm,它指定了><运算符的行为。如果操作数pxpy都是字符串:

  
      
  • 设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)

从您链接的文档:

  

根据每个元素的字符串转换

按字典顺序(按字典顺序)对数组进行排序

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