Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

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

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].

about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

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]))
about 4 years ago · Juan Pablo Isaza Report

0

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

Otherwise you need to get the integer value of those strings to be able to do the math. You can use parseInt() or assign an explicit value according to your logic for each sorting column 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
    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)
})

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!