尝试从一个我知道只包含整数的数组中获取最高和最低值似乎比我想象的更难。
var numArray = [140000, 104, 99];
numArray = numArray.sort();
console.log(numArray)
我希望它展示的是99, 104, 140000
,但实际上它展示的是104, 140000, 99
。因此看起来排序函数将这些值视为字符串。
有没有办法让排序函数按照整数值进行排序?
尝试从一个我知道只包含整数的数组中获取最高和最低值似乎比我想象的更难。
var numArray = [140000, 104, 99];
numArray = numArray.sort();
console.log(numArray)
我希望它展示的是99, 104, 140000
,但实际上它展示的是104, 140000, 99
。因此看起来排序函数将这些值视为字符串。
有没有办法让排序函数按照整数值进行排序?
sort()
方法。但如果你正在寻找更多对数组进行排序的方法,并且您也喜欢循环,请查看以下内容。Ascending:
var numArray = [140000, 104, 99];
for (var i = 0; i < numArray.length; i++) {
var target = numArray[i];
for (var j = i - 1; j >= 0 && (numArray[j] > target); j--) {
numArray[j+1] = numArray[j];
}
numArray[j+1] = target
}
console.log(numArray);
降序:
var numArray = [140000, 104, 99];
for (var i = 0; i < numArray.length; i++) {
var target = numArray[i];
for (var j = i - 1; j >= 0 && (numArray[j] < target); j--) {
numArray[j+1] = numArray[j];
}
numArray[j+1] = target
}
console.log(numArray);
选择排序:
升序:
var numArray = [140000, 104, 99];
for (var i = 0; i < numArray.length - 1; i++) {
var min = i;
for (var j = i + 1; j < numArray.length; j++) {
if (numArray[j] < numArray[min]) {
min = j;
}
}
if (min != i) {
var target = numArray[i];
numArray[i] = numArray[min];
numArray[min] = target;
}
}
console.log(numArray);
降序:
var numArray = [140000, 104, 99];
for (var i = 0; i < numArray.length - 1; i++) {
var min = i;
for (var j = i + 1; j < numArray.length; j++) {
if (numArray[j] > numArray[min]) {
min = j;
}
}
if (min != i) {
var target = numArray[i];
numArray[i] = numArray[min];
numArray[min] = target;
}
}
console.log(numArray);
玩得开心
...
function sortNumber(a, b)
{
return a - b;
}
numArray = numArray.sort(sortNumber);
Array.prototype.sort()是对数组进行排序的常用方法,但是我们需要注意一些问题。
默认情况下,排序顺序是按字典顺序排序,而不是按数字顺序排序,无论数组中的值的类型是什么。即使数组全是数字,所有的值也将转换为字符串并按字典顺序排序。
因此,我们应该像下面这样自定义sort()和reverse()方法。
如果要对数组内的数字进行排序
numArray.sort(function(a, b)
{
return a - b;
});
对于反转数组中的数字
numArray.sort(function(a, b)
{
return b - a;
});
下面的'numerically'函数通常用作回调函数,在许多情况下对数字数组进行数值排序:
function numerically(a, b){
return a-b;
}
array.sort(numerically);
但是,在某些罕见情况下,当数组包含非常大的负数时,由于a-b变得比JavaScript可以处理的最小数字还要小,因此可能会发生溢出错误。
因此,编写数值函数的更好方法如下:
function numerically(a, b){
if(a < b){
return -1;
} else if(a > b){
return 1;
} else {
return 0;
}
}
DBL_MIN-DBL_MAX
),但下溢是不可能的。灾难性抵消使结果不精确,失去了大部分“有效数字”,但是**a-b
始终是非零的,并具有a!=b的正确符号。** - Peter Cordes处理undefined、null和NaN:null的行为类似于0,而NaN和undefined则排在最后。
array = [3, 5, -1, 1, NaN, 6, undefined, 2, null]
array.sort((a,b) => isNaN(a) || a-b)
// [-1, null, 1, 2, 3, 5, 6, NaN, undefined]
接受的答案以及等价的方法,例如numArray.sort((a,b) => a - b)
在数组中仅包含没有无穷大或NaN的数字时非常好。它们可以通过以下方式扩展以处理无穷大和NaN:
numArray.sort((a,b) => (+a || 0) - (+b || 0) || 0);
这将把NaN(或任何非数字,如'foo'或{})视为0进行排序。最后的|| 0
是必需的,以处理a和b相等的无穷大情况。
sort()
compareFunction
严格返回-1、0或1(类似于PHP中的spaceship operator的工作方式),则可以使用Math.sign()
。下面的compareFunction
严格返回-1、0或1:numArray.sort((a, b) => Math.sign(a - b));
注意:
Math.sign()
在Internet Explorer中不受支持。
对于普通的元素值数组:
function sortArrayOfElements(arrayToSort) {
function compareElements(a, b) {
if (a < b)
return -1;
if (a > b)
return 1;
return 0;
}
return arrayToSort.sort(compareElements);
}
e.g. 1:
var array1 = [1,2,545,676,64,2,24]
**output : [1, 2, 2, 24, 64, 545, 676]**
var array2 = ["v","a",545,676,64,2,"24"]
**output: ["a", "v", 2, "24", 64, 545, 676]**
对于一个对象数组:
function sortArrayOfObjects(arrayToSort, key) {
function compareObjects(a, b) {
if (a[key] < b[key])
return -1;
if (a[key] > b[key])
return 1;
return 0;
}
return arrayToSort.sort(compareObjects);
}
e.g. 1: var array1= [{"name": "User4", "value": 4},{"name": "User3", "value": 3},{"name": "User2", "value": 2}]
**output : [{"name": "User2", "value": 2},{"name": "User3", "value": 3},{"name": "User4", "value": 4}]**
a.id - a.id
。
const myJson = [
{ id: 1, name: 'one'},
{ id: 4, name: 'four'},
{ id: 2, name: 'two'},
{ id: 3, name: 'three'}
];
// provide the sort method to check
const myNewSort = myJson.sort(function(a, b) {
return a.id - b.id;
});
console.log('my new sort',myNewSort)
尝试使用以下代码
var a = [5, 17, 29, 48, 64, 21];
function sortA(arr) {
return arr.sort(function(a, b) {
return a - b;
})
;}
alert(sortA(a));