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