在Javascript中,如果我有一个数组数组,如下所示:
X = [ [1,2,3,4],
[1,1,2,3],
[1,1,3],
[1,4],
[2,1,2],
[2,2]
]
Javascript对我的数组进行排序,首先比较第一个条目,然后比较第二个,依此类推,以便X.sort()
返回以下内容:
[ [1,1,2,3],
[1,1,3],
[1,2,3,4],
[1,4],
[2,1,2],
[2,2]
]
这就是我想要的。问题是用于比较数组中元素的比较运算符是词典,所以[10,2] < [2,2]
,例如,
[[10,2],[1,1,3],[2,2]].sort() -> [[1,1,3],[10,2],[2,2]]
我需要它以数字方式排序,以便我得到一个[[1,1,3],[2,2],[10,2]]
的排序数组。
我尝试使用function(a,b){return (a-b) }
的比较函数,它可以用于排序数字数组,但这无法正确排序我的数组,这是有意义的(我认为),因为[10,2] - [1,1,3]
产生{ {1}}
如何对数组数组进行排序?
答案 0 :(得分:6)
正如我在评论中所说,sort
函数需要考虑它接收数组作为参数而不是普通值的事实。所以你需要相应地处理它们。
我建议这样做;
var compFunc = function (a, b) {
var len = a.length > b.length ? b.length : a.length;
for(var i=0; i<len; ++i) {
if(a[i] - b[i] !== 0)
return a[i] - b[i];
}
return (a.length - b.length);
};
它首先尝试查找两个数组的公共长度的差异。如果公共长度完全相同,则根据数组长度进行排序。 Here's a working fiddle
答案 1 :(得分:1)
你想要的是运行自然类型。对于比较功能,请将其替换为本文中提到的脚本
答案 2 :(得分:1)
执行X.sort()
时,Javascript会将您的各个数组作为字符串进行比较。它基本上是a.toString().localeCompare(b.toString())
。这不是你想要的。
a.toString()
通常与a.join(',')
我要做的是使用for循环比较数组中的每个元素。
这样的事情:
X.sort(function(a,b){
// Start off assuming values are equal
var ret = 0;
// Loop through a
for(var a_i = 0, a_length = a.length; a_i < a_length; a_i++){
// If b is shorter than a, it comes first
if(typeof b[a_i] === 'undefined'){
ret = 1;
break;
}
// if the element in a and b are *not* the same, then we can sort
else if(a[a_i] !== b[a_i]){
ret = a[a_i] - b[a_i];
break;
}
}
return ret;
});
答案 3 :(得分:0)
您需要在2个数组之间进行排序和比较: http://jsfiddle.net/pXzB6/
var arr = [[10,2],[1,1,3],[2,2]];
arr.sort(function(a,b){
for(var i=0;i<a.length;i++){
var item_a = a[i];
for(var j=0;j<b.length;b++){
var item_b = b[j];
if(item_a == item_b){
continue;
}
else{
return item_a > item_b;
}
}
}
if(a.length == b.length){
return 0;
}
else{
return a.length > b.length;
}
});
console.log(arr);
答案 4 :(得分:0)
var points = [40,100,1,5,25,10];
points.sort(function(a,b){return a-b});
然后结果是: 1,5,10,25,40,100
这是我认为最简单的方法,它起作用了。