我正在尝试对整数数组进行排序,以便将它们按照将形成最大整数的顺序排列。例如,[99,901]应该按[99,901]排序,因为99,901> 90199。并且[91,991]应该被分类为[991,91]因为99,191> 91991
为此,我使用Array.prototype.sort(),将下面代码块中的compare函数作为参数传递。此比较函数的参数是一个数组数组(每个整数首先被拆分为一位数的整数数组):[[9,1],[9,9,1]]。
我的问题是,当这个比较函数工作时,它返回一个截断了一些元素的数组。显然这是因为当需要比较两个整数的第二个(或第三个,第四个等)元素时,我正在调用Array.prototype.shift()。我没有想到这个,但找不到解决办法。
例如,下面的代码输出
[[9],[1,9]]
而我需要的是
[[9,9],[9,1,9]]
你能告诉我如何修改比较功能以获得我想要的输出吗?
谢谢!
var compare = function(a, b){
if(a.length === 1 || b.length === 1){
return (b[0] - a[0]);
}
else if(a[0] !== b[0]){
return compare(a[0], b[0]);
}
else if(a[0] === b[0]){
if(a.length !== 1){
a.shift();
}
if(b.length !== 1){
b.shift();
}
return compare(a, b);
}
};
var example = function(){
var digits = [[9,9],[9,1,9]];
digits.sort(compare);
console.log(digits);
};
example();
答案 0 :(得分:0)
最简单(但效率低下)的方法是复制数组:
var compare = function(a, b){
a = a.slice();
b = b.slice();
答案 1 :(得分:0)
虽然您已经接受了答案,但我仍然想回答您的问题... "我如何修改比较功能?" ,因为您确实需要to:它目前为某些输入提供了错误的结果,例如:
var compare = function(a, b){
if(a.length === 1 || b.length === 1){
return (b[0] - a[0]);
}
else if(a[0] !== b[0]){
return compare(a[0], b[0]);
}
else if(a[0] === b[0]){
if(a.length !== 1){
a.shift();
}
if(b.length !== 1){
b.shift();
}
return compare(a, b);
}
};
console.log('this should return a number greater than 0:');
console.log(compare([8,1],[8,1,9,2]));

以下是如何纠正它,并且没有变异也是如此:
var compare = function(a, b){
for (var i = 0; i < a.length || i < b.length; i++) {
var diff = b[i % b.length] - a[i % a.length];
if (diff) return diff;
}
return 0;
};
console.log('this should return a number greater than 0:');
console.log(compare([8,1],[8,1,9,2]));
var digits = [[8,1],[8,1,9,2]];
digits.sort(compare);
console.log('sorted:');
console.log(JSON.stringify(digits));
&#13;