jQuery 按两个值排序无效,只能按第一个值排序

jQuery sorting by two values is not working and only sorts by first value

我有一个看起来像这样的数组

['NAME', 5, '2. Defender', 'FALSE', 'TRUE', 'FALSE', 'undefined']
['NAME', 5, '4. Forward', 'TRUE', 'TRUE', 'FALSE', 'undefined']
['NAME', 5, '2. Defender', 'FALSE', 'TRUE', 'FALSE', 'undefined']
['NAME', 4, '4. Forward', 'FALSE', 'TRUE', 'FALSE', 'undefined']
['NAME', 3, '5. Midfielder', 'FALSE', 'FALSE', 'FALSE', 'undefined']

我正在参考 this page 如何排序,这就是我所拥有的:

array.sort(
    function(a, b) {          
      if (a[1] === b[1]) {
        // Price is only important when cities are the same
        return b[2] - a[2];
      }
      return a[1] < b[1] ? 1 : -1;
  });

它仅按 [1] 值排序,不会按辅助 [2] 值排序。我以为我的数组可能有问题,但是当我先切换为按 [2] 排序时,它会按该值排序。虽然目标是首先按 [1] 排序,然后再按 [2].

排序

第三个数组元素[2]是一个字符串,不能通过减法进行比较。使用 .localeCompare 代替

array.sort((a, b) => a[1] !== b[1] ? a[1] - b[1] : a[2].localeCompare(b[2]))

您正在尝试对两个字符串执行数学运算('2. Defender''4. Forward')。
您可以 嵌套 a[1]b[1] 相同的比较,如下所示:

let array = [
  ['ONE1', 5, '2. Defender', 'FALSE', 'TRUE', 'FALSE', 'undefined'],
  ['TWO2', 5, '4. Forward', 'TRUE', 'TRUE', 'FALSE', 'undefined'],
  ['THR3', 5, '2. Defender', 'TRUE', 'TRUE', 'FALSE', 'undefined'],
  ['FOR4', 4, '4. Forward', 'FALSE', 'TRUE', 'FALSE', 'undefined'],
  ['FIV5', 3, '5. Midfielder', 'FALSE', 'FALSE', 'FALSE', 'undefined']
]
array.sort(function(a, b) {
  if (a[1] === b[1]) {
    // Price is only important when cities are the same
    if (a[2] === b[2]) {
      //return 0;
      /* 
        or nest another comparison here and as many times as needed 
        within each child `a[n]===b[n]` block
       */
      if (a[3] === b[3]) {
        return 0; // or compare yet another col
      }
      return a[3] < b[3] ? 1 : -1;
    }

    return a[2] < b[2] ? 1 : -1;
  }

  return a[1] < b[1] ? 1 : -1;
})

array.forEach((p) => {
  console.log(p[0])
})

否则,您需要获取这些字符串的整数值才能进行数学计算。您可以使用 parseInt() 或根据您的逻辑为每个排序列分配显式值,如下所示:

let array = [
  ['ONE1', 5, '2. Defender', 'FALSE', 'TRUE', 'FALSE', 'undefined'],
  ['TWO2', 5, '4. Forward', 'TRUE', 'TRUE', 'FALSE', 'undefined'],
  ['THR3', 5, '2. Defender', 'TRUE', 'TRUE', 'FALSE', 'undefined'],
  ['FOR4', 4, '4. Forward', 'FALSE', 'TRUE', 'FALSE', 'undefined'],
  ['FIV5', 3, '5. Midfielder', 'FALSE', 'FALSE', 'FALSE', 'undefined']
]
array.sort(function(a, b) {
  if (a[1] === b[1]) {
    // Price is only important when cities are the same
    let c = parseInt(a[2]);
    let d = parseInt(b[2]);
    if (c === d) {
      // the string 'TRUE' before 'FALSE', '' or null 
      let e = (a[3] === 'TRUE') ? 1 : 0;
      let f = (b[3] === 'TRUE') ? 1 : 0;

      return f - e;
    }

    return d - c;
  }

  return a[1] < b[1] ? 1 : -1;
})

array.forEach((p) => {
  console.log(...p)
})