代码之家  ›  专栏  ›  技术社区  ›  Kyle Hotchkiss

在javascript中对多维数组进行排序

  •  6
  • Kyle Hotchkiss  · 技术社区  · 15 年前

    如何在javascript中对多维数组进行排序?

    我有一个数组,其中包含两个日期和一个字符串。我需要按日期数组之一排序的主数组,这可能吗?

    数据结构:

    events = [
     { date 1, date 2, string },
     { date 2, date 2, string },
     ]
    
    3 回复  |  直到 11 年前
        1
  •  14
  •   Community CDub    8 年前

    复制品 sort outer array based on values in inner array, javascript 在这里你可以找到几个答案,就像我自己的答案一样

    var arr = [.....]
    arr.sort((function(index){
        return function(a, b){
            return (a[index] === b[index] ? 0 : (a[index] < b[index] ? -1 : 1));
        };
    })(2)); // 2 is the index
    

    按索引2排序

        2
  •  4
  •   Anurag    15 年前

    从您的描述来看,数组结构似乎有点模糊。可以使用自定义排序函数比较元素并进行排序。

    假设结构为:

    var data = [
        [date11, date12, string],
        [date21, date22, string],
        [date31, date32, string],
        ...
    ];
    

    如果有对象而不是嵌套数组,则不需要使用数字索引。在这里 a[0] b[0] 用于比较两个嵌套数组中的第一个项(假定其日期是要排序的)。另外,假设a[0]和b[0]已经是日期对象-如果日期对象尚未创建,则可能需要创建它们。

    更新 :感谢@maerics指出这一点。比较器的返回值需要是与[A<B,A==B,A>B]值对应的[负,0,正]。

    function sortByDate(a, b) {
        return a[0].getTime() - b[0].getTime();
    }
    
    data.sort(sortByDate);
    
        3
  •  1
  •   kennebec    15 年前

    此示例用于按数字(和日期)或字符串对数组进行排序。

    Array.prototype.deepsort= function(){
        var i, order= arguments, L= order.length, tem;
        return this.sort(function(a, b){
            i= 0;
            while(i < L){
                tem= order[i++];
                var ao= a[tem] || 0, bo= b[tem] || 0;
                if(ao== bo) continue;
                return ao> bo? 1: -1;
            }
            return 0;
        });
    }
    
    var a= [ [ 'z', 1, 0 ], [ 'a', 0, 1 ],['m',-1,10] ,['a','1',-1]];
    
    alert(a.deepsort(0,1,2)+'\n\n'+a.deepsort(2,0,1)) 
    

    按所选索引排序(作为参数传递)。

    如果每个数组中该索引处的项匹配, 对作为参数传递的下一个索引(如果有)进行排序。

    只要项匹配并且有更多参数,就继续。

    不需要指定多个索引来排序

    a.deepsort(0);
    a.deepsort(2);