使用多维数组的 JavaScript 多级排序

标签 javascript arrays json sorting multidimensional-array

我有一个如下所示的 JSON 对象:

[
    {
        "name": "Robert",
        "age":32,
        "country": "UK"
    },
    {
        "name": "Prasad",
        "age":28,
        "country": "India"
    },
    {
        "name": "Benny",
        "age":45,
        "country": "USA"
    },
    {
        "name": "Robin",
        "age":34,
        "country": "UK"
    },
    {
        "name": "Bob",
        "age":20,
        "country": "India"
    }
]

I have applied the array sorting for "name" column alone. I want to apply sort for “name” column first and then “age”.

This is how i sort the array by name:

var sort_by = function(field, reverse, primer){
   var key = primer ? 
     function(x) {return primer(x[field])} : 
     function(x) {return x[field]};
     reverse = [-1, 1][+!!reverse];
     return function (a, b) {
            return a = key(a), b = key(b), reverse * ((a > b) - (b > a));
        }
} 

调用排序函数:

arrayToSort.sort(
    sort_by( “name”, true, function(a){
    return a.toUpperCase();
}) );   

我怎样才能像下面这样对数组进行排序?

[{
    "name": "Bob",
    "age":20,
    "country": "India"
},
{
    "name": "Benny",
    "age":45,
    "country": "USA"
},
{
    "name": "Prasad",
    "age":28,
    "country": "India"
},
{
    "name": "Robert",
    "age":32,
    "country": "UK"
},
{
    "name": "Robin",
    "age":34,
    "country": "UK"
}]

最佳答案

我认为您正在寻找一种“链接”sort_by(..) 调用的方法,以便能够在多个字段上进行操作。

以下是您的代码的略微修改版本。这几乎是不言自明的。

arrayToSort = [ ...];

var sort_by = function(field, reverse, primer){
    var key = primer ? 
         function(x) {return primer(x[field]); }:
         function(x) {return x[field] };
    reverse = [-1, 1][+!!reverse];
    return function (a, b) {
        a = key(a);
        b = key(b);
        return a==b ? 0 : reverse * ((a > b) - (b > a));
                    //^ Return a zero if the two fields are equal!
    }
}

var chainSortBy = function(sortByArr) {
    return function(a, b) {
        for (var i=0; i<sortByArr.length; i++) {
            var res = sortByArr[i](a,b);
            if (res != 0)
                return res; //If the individual sort_by returns a non-zero,
                            //we found inequality, return the value from the comparator.
        }
        return 0;
    }
}

arrayToSort.sort(
    chainSortBy([
        sort_by( "name", true, function(a){
            return a.toUpperCase();
        }),
        sort_by("age", true, null)
    ])
);

console.log(arrayToSort); //Check browser console.

对于输出:check the JSFiddle

关于使用多维数组的 JavaScript 多级排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27644953/

相关文章:

javascript - 具有相等值的数组的 Math.max 方法

javascript - 为什么这个 JavaScript 代码的结果是 "undefined"?

javascript - Firebase 身份验证返回空语句

c# - 我想从用户那里获取请求的整数数量并将它们存储到一个数组中

java - 使用 null/空元素移动数组

android - "Not a primitive array"错误,当我尝试从 JSON 中拉出一个 child 时

javascript - 光滑的 slider 跳跃

ios - Swift 过滤字符串数组

JavaScript JSON 数组编号不一致

javascript - PHPSESSID从B域到A域在Chrome和Firefox上使用,而不是在Safari和IE上使用