【问题标题】:Sorting a multidimensional array in javascript在javascript中对多维数组进行排序
【发布时间】:2010-05-13 02:39:15
【问题描述】:

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

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

数据结构:

events = [
 { date 1, date 2, string },
 { date 2, date 2, string },
 ]

【问题讨论】:

    标签: javascript arrays multidimensional-array


    【解决方案1】:

    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 排序

    【讨论】:

    • +1 我知道这是一篇旧帖子,但它是一个很棒的答案,它帮助我解决了我正在制作的自定义表格排序插件的问题:)
    • javascript 是如何通过让用户返回 1、0 或 -1 来使其复杂化的。相反,为什么不像 python 那样做,它只是 arr.sort( (a,b) => a[0]
    【解决方案2】:

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

    假设结构是:

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

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

    更新:感谢@maerics 指出这一点。比较器的返回值需要为 [负, 0, 正] 对应 [a b] 值。

    function sortByDate(a, b) {
        return a[0].getTime() - b[0].getTime();
    }
    
    data.sort(sortByDate);
    

    【讨论】:

    • 你的意思可能是return a[0].getTime() - b[0].getTime(),因为比较器应该根据 if (ab) 返回 (neg, zero, pos),对吧?
    • 使用 getTime() 没有意义。 a - b 将导致 a.valueOf() 和 b.valueOf() 在幕后使用,这将返回 unix 时间
    【解决方案3】:

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

    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);
    

    【讨论】:

    • 在 Chrome 中效果很好。 'this.sort' 在 Firefox 中引发错误。
    猜你喜欢
    • 2017-11-09
    • 2011-10-23
    • 2012-11-27
    • 2014-01-19
    • 1970-01-01
    • 2015-07-11
    • 2023-01-11
    相关资源
    最近更新 更多