Home > Back-end >  jQuery sorting by two values is not working and only sorts by first value
jQuery sorting by two values is not working and only sorts by first value

Time:05-31

I have an array that looks like this

['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']

I am referencing this page on how to sort it, and this is what I have:

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;
  });

It only sorts by the [1] value and will not sort by the secondary [2] value. I thought there might be something wrong with my array, but when I switch things to sort by [2] first, then it sorts by that value fine. Though the goal is to sort by [1] first, and then secondarily sort by [2].

CodePudding user response:

The third array element [2] is a string which you can't compare by subtraction. Use .localeCompare instead

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

CodePudding user response:

You are trying to perform a mathematical operation with two strings ('2. Defender' vs. '4. Forward').
You can just nest the same comparison you make for a[1] vs. b[1] as below:

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 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)
})

Otherwise you need to get the integer value of those strings to be able to do the math.

  • Related