You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:16:17