我试图根据某个索引对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;
}
}
答案 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);