JavaScript含字符串与整数的二维数组排序问题求助
解决游戏数据排序异常的问题
我来帮你搞定这个排序的坑!首先得说清楚你原来的代码哪里出问题了:你把数组的三个元素直接拼接成字符串来比较,这就导致剩余桩数这种数字会被当作字符串处理——比如字符串"12"和"2"比较时,因为第一个字符"1"比"2"小,所以"12"会被认为比"2"小,这就是你看到排序异常的原因。而且你之前尝试的parseInt(a[0])用错地方了,因为你已经把a转成拼接后的字符串了,根本不是原来的数组元素,自然没效果。
按照你要求的「已完成游戏的条目优先→剩余桩数(整数)→耗时」规则,我们需要分优先级逐个比较,而不是拼接字符串。下面是正确的排序实现:
function mySortingA(a, b) { // 1. 第一优先级:已完成条目优先 // 这里假设你的数组中第二个元素(a[1])是完成状态标记,比如'1'代表已完成,'0'代表未完成 // 请根据你实际的字段值调整这个判断逻辑!比如如果是'完成'/'未完成'就改成 a[1] === '完成' const aIsCompleted = a[1] === '1'; const bIsCompleted = b[1] === '1'; if (aIsCompleted !== bIsCompleted) { // 已完成的排前面,所以如果A完成、B没完成,返回-1让A靠前 return aIsCompleted ? -1 : 1; } // 2. 第二优先级:剩余桩数(整数),从小到大排序(剩余越少越靠前) const remainingA = parseInt(a[0], 10); // 第二个参数10确保是十进制转换 const remainingB = parseInt(b[0], 10); if (remainingA !== remainingB) { return remainingA - remainingB; // 数字相减,小的在前 } // 3. 第三优先级:耗时,从小到大排序(耗时越少越靠前) // 如果耗时是整数用parseInt,是小数就用parseFloat const timeA = parseFloat(a[2]); const timeB = parseFloat(b[2]); return timeA - timeB; }
关键说明:
- 完成状态判断:你需要根据自己实际存储的完成状态值修改
aIsCompleted的判断逻辑,比如如果完成状态存在于数组的第三个元素,就改成a[2] === '已完成'之类的。 - 数字转换:对剩余桩数和耗时必须显式转成数字,而且
parseInt要加第二个参数10,避免遇到以0开头的数字被当成八进制处理。 - 优先级顺序:先判断完成状态,再比较剩余桩数,最后比较耗时,每一层只有当前优先级相等时才会进入下一层比较。
另外,你的localStorage遍历代码也可以优化得更简洁,不用手动排除每个内置属性:
const test = []; // 获取所有用户自定义的localStorage键 const userKeys = Object.keys(localStorage).filter(key => !['key', 'setItem', 'getItem', 'removeItem', 'clear', 'length', 'board'].includes(key) ); userKeys.forEach(key => { test.push(localStorage.getItem(key).split(',')); });
这样遍历更安全,也更易维护~
内容的提问来源于stack exchange,提问作者Olivier
相关产品推荐
相关产品推荐

