一、问题
在使用sort排序时,若遇到相同数据或非数值数据时,会出现苹果手机与安卓手机排序不一致问题
var arr = [{ "id": "52", "return_value": "--" },{ "id": "54", "return_value": "100,000.00%" },{ "id": "66", "return_value": "1000%" },{ "id": "78", "return_value": "--" }];
function sortBy(arr, order, order_by){
if (order == 'asc' || order == 'desc') {
arr.sort((a, b) => {
let x = a[order_by];
let y = b[order_by];
if (x == '--') {
return -1
}
if (y == '--') {
return 1
}
if ( !isNaN(parseFloat(x)) && !isNaN(parseFloat(y)) ) {
x = parseFloat(x);
y = parseFloat(y);
if (x > y) {
return 1;
}
if (x < y) {
return -1;
}
return 0;
}
x = x.toString();
y = y.toString();
return x.localeCompare(y, 'zh-CN');
})
if ('desc' == order) {
arr.reverse();
}
return arr;
}else{
return arr;
}
}
var sortArr = sort(arr, "desc", "return_value");
sortArr.forEach(function (item, i) {
var div = document.createElement("div");
div.innerHTML = item.id + ":" + item.return_value;
document.body.appendChild(div);
});
二、原因
sort排序原理:
a:"因为排序依据是相同的就是没有顺序,没有顺序就是乱序,这种结果是正确的";
b:"既然排序依据是相同的那就按照原始顺序输出"(这应该是大多数据语言里常规的做法)
经手机测试,两种手机排序不一致是因为苹果手机使用了原理b进行排序,而安卓手机使用了原理a进行排序。
三、解决
方法1:根据排序前的索引进行排序。先循环给每个元素增加一个属性,用来保存它目前的位置,然后再排序中遇到等序时取索引进行排序。参考网址:https://blog.csdn.net/qq_18145031/article/details/82500177
方法2:根据数组中的自增字段进行排序
function sort(arr, order, order_by) {
if (order == 'asc' || order == 'desc') {
arr.sort(function (a, b) {
let x = a[order_by];
let y = b[order_by];
if (x == '--' && y != '--') {
return 1;
}
if (x != '--' && y == '--') {
return -1;
}
x = x.toString().replace(/,/g, '');
y = y.toString().replace(/,/g, '');
if (order == 'asc') { // 升序
if (x == '--' && y == '--') {
return parseInt(a.id) - parseInt(b.id)
} else {
if (!isNaN(parseFloat(x)) && !isNaN(parseFloat(y))) {
return parseFloat(x) - parseFloat(y);
}
return x.localeCompare(y, 'zh-CN');
}
} else { // 降序
if (x == '--' && y == '--') {
return parseInt(b.id) - parseInt(a.id)
} else {
if (!isNaN(parseFloat(x)) && !isNaN(parseFloat(y))) {
return parseFloat(y) - parseFloat(x);
}
return y.localeCompare(x, 'zh-CN');
}
}
});
return arr;
} else {
return arr;
}
}
var sortArr = sort(arr, "desc", "return_value");
sortArr.forEach(function (item, i) {
var div = document.createElement("div");
div.innerHTML = item.id + ":" + item.name + "--" + item.return_value;
document.body.appendChild(div);
});
分类:
问题整理以及解决
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!