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

7

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

我有一个包含两个日期和一个字符串的数组,里面又包含很多个这样的数组。我需要按照其中一个日期数组来对主数组进行排序,这可能吗?

数据结构:

events = [
 { date 1, date 2, string },
 { date 2, date 2, string },
 ]
3个回答

25

重复问题,参见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 我知道这是一个旧帖子,但这是一个很棒的答案,它帮助我解决了我正在制作的自定义表格排序插件的问题 :) - Iron3eagle
为什么JavaScript要通过让用户返回1、0或-1来使其变得复杂呢?为什么不像Python一样,只需使用arr.sort((a,b) => a[0] < b[0)即可完成排序。假设arr是一个数组的数组,并且您想按内部数组的第一个元素进行排序。 - Embedded_Mugs

6

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

假设该结构为:

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

如果你使用对象而不是嵌套数组,就不需要使用数字索引。这里使用a[0]b[0]来比较两个嵌套数组中的第一个项目(假设它是你要排序的日期)。此外,假设a[0]和b[0]已经是日期对象——如果它们还不是日期对象,您可能需要创建日期对象。
更新:感谢@maerics指出。比较器的返回值需要为[负数,0,正数],分别对应[ab]的值。
function sortByDate(a, b) {
    return a[0].getTime() - b[0].getTime();
}

data.sort(sortByDate);

2
你可能是想要返回 return a[0].getTime() - b[0].getTime(),因为比较器应该根据 (a<b, a==b, a>b) 返回 (负数, 零, 正数),对吧? - maerics
没有使用getTime()的必要。a - b会在后台使用a.valueOf()和b.valueOf(),这将返回Unix时间。 - Sean Kinsey

1

这个例子是用于按数字(和日期)或字符串对数组进行排序。

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中运行良好。在Firefox中,'this.sort'会抛出一个错误。 - Kyle Hotchkiss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接