JavaScript数组排序:sort方法与自定义实现详解

作者:青柠

时间:2026-10-30

浏览:143

本文介绍JavaScript中数组排序的两种实现方式。首先解析内置sort()方法需配合比较函数处理数字排序的原理,随后详细讲解基于for循环的手动排序算法。内容涵盖数组深拷贝技巧(concat、slice)、splice删除操作及引用类型特性,对比两种方法对原数组的影响及性能差异。

文章目录

前言

对数组进行排序是开发中的常见需求,尤其在后端处理中更为普遍,但前端开发同样经常遇到此类场景。

针对数组排序,JavaScript提供了现成的内置方法,即sort()。

接下来首先介绍该内置方法的用法。

标准答案:使用sort方法

标准答案:使用sort方法


var arr = [45,98,67,57,85,6,58,83,48,18];
console.log('原数组');
console.log(arr);
console.log('sort方法从小到大排序');
console.log(arr.sort(function(a,b){return a-b}));
console.log('sort方法从大到小排序');
console.log(arr.sort(function(a,b){return b-a}));

运行结果如下所示。

标准答案:使用sort方法

需要注意的是,sort()方法默认按字符串字母顺序进行排序。因此,在对数字数组进行排序时,必须传入一个自定义的比较函数。

参考上述代码示例。

function(a,b){return a-b}

上述函数实现了从小到大的排序逻辑。虽然代码简洁,但为了深入理解其机制,下面将尝试根据个人思路实现排序功能。

自定义方案:基于for循环的排序实现

自定义方案:基于for循环的排序实现


var arr = [45,98,67,57,85,6,58,83,48,18];
console.log('原数组');
console.log(arr);
console.log('for方法从小到大排序');
console.log(arrSortMinToMax(arr));
console.log('for方法从大到小排序');
console.log(arrSortMaxToMin(arr));
// 找数组中最小的值
function arrMinNum(arr){
var minNum = Infinity, index = -1;
for (var i = 0; i < arr.length; i++) {
if (arr[i]<minNum) {
minNum = arr[i];
index = i;
}
};
return {"minNum":minNum,"index":index};
}
// 返回数组从小到大排序结果
function arrSortMinToMax(arr){
var arrNew = [];
var arrOld = arr.concat();
for (var i = 0; i < arr.length; i++) {
arrNew.push(arrMinNum(arrOld).minNum);
arrOld.splice(arrMinNum(arrOld).index,1)
};
return (arrNew);
}
// 找数组中最大的值
function arrMaxNum(arr){
var maxNum = -Infinity, index = -1;
for (var i = 0; i < arr.length; i++) {
if (arr[i]>maxNum) {
maxNum = arr[i];
index = i;
}
};
return {"maxNum":maxNum,"index":index};
}
// 返回数组从大到小排序结果
function arrSortMaxToMin(arr){
var arrNew = [];
var arrOld = arr.slice(0);
for (var i = 0; i < arr.length; i++) {
arrNew.push(arrMaxNum(arrOld).maxNum);
arrOld.splice(arrMaxNum(arrOld).index,1);
};
console.log(arr)
return (arrNew);
}

该方法的运行结果如下图所示。

标准答案:使用sort方法

自定义方法的关键知识点

自定义方法中涉及的关键知识点。

当函数需要返回多个数据项时,使用JSON对象格式更为便捷,例如上述代码中的return {"minNum":minNum,"index":index};。

若使用var arrOld = arr直接复制数组,并对arrOld进行操作,会直接影响原数组arr。这是因为JavaScript区分原始类型与引用类型(与Java、C#类似),Array属于引用类型,arrOld获得的是引用地址,因此修改arrOld会同步影响arr。

数组复制方法一:var arrOld = arr.concat();。原理是利用concat()函数拼接数组的特性,此处拼接自身等同于完成数组复制。

数组复制方法二:var arrOld = arr.slice(0)。原理是利用slice()截取数组的特性,设置起始值为0且未指定结束值时,会截取全部元素,从而实现数组复制。

splice()方法用于插入、删除或替换数组元素。在本方案中,主要利用其删除指定位置元素的特性来移除已排序的元素。

自定义方法与sort()方法的主要差异。

自定义方法不会修改原数组,而sort()方法是在原数组基础上进行修改。自定义方法返回一个新数组,原数组保持不变(这似乎与上一句含义重复)。

排序是编程中基础且重要的知识点。sort()方法在处理大量数据时效率较低,同样,上述自定义方法的执行效率也不高。

本文转载于:http://blog.csdn.net/fungleo/article/details/51555590

以上介绍了JavaScript中sort数组排序方法及自我实现排序方法的完整内容,希望对大家有所帮助。如有任何疑问,欢迎留言,小编会及时回复。在此感谢大家对本站的支持。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章