本文详解JavaScript中二维数组的排序方法。通过自定义比较函数,实现基于数值和字符串(含中文拼音)的排序。同时提供完整的表格交互排序示例,展示如何结合HTML DOM操作实现前端动态排序,有效降低服务器负载。
JavaScript二维数组排序概述
近期在处理JavaScript排序需求时,考虑到数据库排序对服务器资源消耗较大,若将排序逻辑移至客户端执行,可显著降低服务器内存压力。在客户端技术中,除JavaScript外还有ActionScript等选项,但由于后者学习成本较高且掌握程度有限,最终选择深入研究JavaScript。经实际测试,JavaScript内置的sort方法执行效率表现优异。
JavaScript默认提供的sort函数会依据字符的ASCII码值进行升序排列。然而,面对二维数组的复杂排序需求,PHP中常用的multi_sort函数在JS中并不存在。不过,得益于JavaScript的sort函数支持传入自定义比较函数,我们仍可通过定义比较逻辑来实现二维数组的精准排序。
数值排序实现
1、按数值排序 假设存在如下数组结构:
代码如下:
var arr = [[1, 2, 3], [7, 2, 3], [3, 2, 3]];若需依据每个子数组的第一列数值进行排序,可定义如下比较函数:
代码如下:
arr.sort(function(x, y){
return x[0] – y[0];
});该比较函数的核心机制在于:sort方法会依次将数组元素赋值给参数x和y。例如,初始时将arr[0]赋给x,arr[1]赋给y,随后计算x[0]与y[0]的差值。若返回值大于0,则将x置于y之后;若等于0,保持相对位置不变;若小于0,则将x置于y之前。此过程递归进行,直至整个数组排序完毕。上述代码实现的是默认升序排列。若需降序排列,只需调整比较逻辑为return y[0] – x[0]即可。此处x[0]代表按第一列排序,亦可替换为其他索引以按指定列排序。需注意,sort方法会直接修改原数组arr的结构,排序结束后arr即为按第一列升序排列的结果。
字符串与中文排序
2、按字符串排序 对于字符串排序,可利用JavaScript提供的localeCompare方法。 localeCompare的作用:依据本地特定的排序规则比较两个字符串。 其使用规则为stringObject.localeCompare(target)。若stringObject小于target,返回负数;若大于target,返回正数;若相等或按本地规则无区别,返回0。该方法采用操作系统底层的本地字符排序规则,这与单纯使用大于号比较Unicode数值的方式不同,后者往往不符合多语言环境的排序习惯。 例如:
代码如下:
var arr = [['中','国'], ['啊','的'], ['哦','的']];
arr.sort(function(x, y){
return x[0].localeCompare(y[0]);
});执行上述代码后,第一列文字将按拼音顺序排列。若字符串包含英文,默认英文会排在中文之前;纯英文字符串则按字母顺序排列,且大写字母排在小写字母之后。此方法同样适用于中文与英文混合排序的场景。若需实现降序排列,只需将比较逻辑改为return y[0].localeCompare(x[0])即可。
通过上述方法,JavaScript二维数组的排序问题得以解决。该技术在多种场景下均有广泛应用,希望能对读者有所帮助。
表格交互排序示例
代码如下:
function tblSort(s){
for(r = 0;r < row_len;r++){
arrs[r]=[]
for(c=0;c<cel_len;c++){
arrs[r][c] ={}//二维数组里再创建一个对象;
arrs[r][c].html = table.rows[r].cells[c].innerHTML//取表格HTML放进一个关联数组里面,用于排序后显示在页面上;
var text = table.rows[r].cells[c].innerText//取得表格的文字内容用于下面的判断;
//检测可能出现的内容如果不是正常的数据就变成负数,排在最后面;
if(text == '-'){
arrs[r][c].text='-1';
}else if(text=='重新检测'){
arrs[r][c].text='-2';
}else if(text=='无百度快照'||text=='无排名数据'){
arrs[r][c].text='-3'
}else if(text == ''){
arrs[r][c].text='-4'
}else{
arrs[r][c].text=table.rows[r].cells[c].innerText//取表格文字内容放进一个关联数组里面。用于下面的sort做排序。
}
}
}
//alert(arrs[0][0]['text'])
//reve判断当前是正常排序还是反序;
if(reve){
arrs.sort(function(x,y){
return parseFloat(y[s]['text']) - parseFloat(x[s]['text'])
});
reve=0
}else{
arrs.sort(function(x,y){
return parseFloat(x[s]['text']) - parseFloat(y[s]['text'])//排序
})
reve=1
}
//将排好的html内容放入表格里
for(r = 0;r < row_len;r++){
for(c=0;c<cel_len;c++){
table.rows[r].cells[c].innerHTML =arrs[r][c]['html']
}
}
}
//表格排序结束