在javascript中对n维对象的数组进行排序

时间:2015-08-05 17:34:50

标签: javascript arrays sorting

我试图根据某个索引对n维对象的数组进行排序。例如,如果我有一个数组:

var array1 = [['c',24,"John"],['a',-13,"Cindy"],['b',98,"Alex"]];

我希望能够按任何维度进行排序。 javascript中是否存在任何可以提供如下输出的内容?

array1.sort(sortFunction(0));
- [['a',-13,"Cindy"],['b',98,"Alex"],['c',24,"John"]]

array1.sort(sortFunction(1));
- [['a',-13,"Cindy"],['c',24,"John"],['b',98,"Alex"]]

array1.sort(sortFunction(2));
- [['b',98,"Alex"],['a',-13,"Cindy"],['c',24,"John"]]

谢谢!

澄清一下:我知道你必须编写一个排序函数,但是你能编写一个参数吗?这是一个例子:

function sortFunction(dim){
  if (a[dim] === b[dim]) {
    return 0;
  }
  else {
    return (a[dim] < b[dim]) ? -1 : 1;
  }
}

3 个答案:

答案 0 :(得分:4)

您可以编写一个函数生成器来获取数组中参数的索引:

var array = [['a',24,"John"],['a',-13,"Cindy"],['b',98,"Alex"]];

  function sorting(index) {
    return function(a, b) {
        return a[index] < b[index]?-1:(a[index] > b[index])?1:0;
    }
  }

  var res1 = array.sort(sorting(0));
  var res2 = array.sort(sorting(1));
  var res3 = array.sort(sorting(2));

答案 1 :(得分:2)

注意:这是sort回调函数工作原理的基本方法。有关更优雅的解决方案,请参阅Paul Boute’s answer。当函数需要在多种情况下应用时,他的解决方案特别有用。

您的sort函数需要比较元素(或两个元素)本身的两个属性。如果它们的顺序正确,则需要返回负数,0如果它们是等价的,则返回正数,如果它们的顺序错误。

这样一个函数的JavaScript示例:

function sortFunction(elementA,elementB,index){
  if(elementA[index]<elementB[index]){
    return -1;
  }
  else if(elementA[index]>elementB[index]){
    return 1;
  }
  else{
    return 0;
  }
}

可以这样开启:

array1.sort(function(a,b){
  return sortFunction(a,b,1);
});

或更短的一体化版本:

array1.sort(function(a,b){
  var index=1;
  if(a[index]<b[index]){
    return -1;
  }
  else if(a[index]>b[index]){
    return 1;
  }
  else{
    return 0;
  }
});

答案 2 :(得分:0)

您还可以使用underscore.js之类的库。然后,只需

// which index to sort on
var s = 1;
// sort it - it will work for objects too
_.sortBy(array1, function(a){ return a[s];});

// or simply use "property name" to sort on
_.sortBy( array1, s);