Javascript array. prototype.sort()无意中改变了数组
Javascript Array.prototype.sort() unintentionally mutating array
我正试图对整数数组进行排序,以便将它们按形成最大整数的顺序排列。例如,[99,901]应该排序为[99,901],因为99,901> 90,199。而[91,991]应该排序为[991,91],因为99,191> 91,991。
要做到这一点,我使用Array.prototype.sort(),在下面的代码块中传递比较函数作为参数。这个比较函数的参数是一个数组的数组(每个整数首先被分割成一个单位数整数数组):[[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();
最简单(但效率较低)的方法是复制数组:
var compare = function(a, b){
a = a.slice();
b = b.slice();
虽然你已经接受了答案,但我还是想回答你的问题…"如何修改我的比较函数?",因为您确实需要:它目前会为某些输入提供错误的结果,例如:
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));
相关文章:
- 如何防止JavaScript无意中更改浏览器位置
- React 路由器和任意查询参数:页面在加载时无意中刷新
- 如何在红绿灯序列中改变颜色
- 在角度中改变方向
- iframe src 网址无意中更改了父网址
- jQuery在循环中改变这个的含义
- 按下按钮会使 JavaScript 无意中重新加载页面
- 试图理解无法在JavaScript中改变字符串/数字的概念
- Jquery在偶数类中改变每个下一个偶数tr的颜色
- Javascript的右手值在循环中改变自身
- 使用 javascript 在 Android 中改变方向
- 为什么函数中改变的对象会改变它们在内存中指向的内容,但有时会创建一个新的内存对象
- 什么'这是在React.js中改变复杂状态的最佳方法
- 如何在mongodb / mongoose查询中改变基于参数的结果位置
- 如何在Google Maps v3 API中改变KmlLayer的颜色
- 在jQuery中改变框架位置
- 在three.js中改变单个精灵的颜色
- 如何在angular2中改变模型的值
- Javascript array. prototype.sort()无意中改变了数组
- 标题按钮's文本/字体-重量无意中改变