使用多维数组进行JavaScript多级排序

时间:2014-12-25 07:00:13

标签: 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"
    }
]

我已经单独为“name”列应用了数组排序。我想首先对“name”列进行排序,然后对“age”进行排序。

这是我按名称排序数组的方式:

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

调用sort函数:

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"
}]

2 个答案:

答案 0 :(得分:1)

我认为您所寻找的是一种“链接”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

答案 1 :(得分:0)

解决方案回归原生,只是:

function orderByProp(arr,prop){

  var order = [], ordered=[];
    //create temp ID and Save the real index
  for(i=0; i < arr.length;++i){ order.push(arr[i][prop]+"-:-"+i);} 

  ordered.sort();

  for(i=0; i < arr.length;++i){
     var val = order.split("-:-");
     ordered.push(arr[val[1]]); Get the real array by saved index
  }
  return ordered;
}
// Apply
var arr = [{
    "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"
  }];
  var sort = orderByProp(arr,"name");

我没有测试过这个。但希望它可以解决你的问题