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.