I am trying to reorder an array by two conditions. Making sure that Pos 10
goes after single digits and that it follows a specific order after that.
I tried to give priority to the string that includes first
but then if I want to order alphanumerically it resets A to the top. How could I optain the expected result?
const arr = [
'Pos 10 second',
'Pos 10 A third',
'Pos 10 first',
'Pos 1 second',
'Pos 1 A third',
'Pos 1 first',
'Pos 2 second',
'Pos 2 A third',
'Pos 2 first',
]
const res = arr.sort((a, b) => {
if (a.includes('first')) {
return -1
} else {
return 1
}
}).sort((a, b) => a.localeCompare(b, 'en', { numeric: true}))
console.log(res)
/* Expected output
[
'Pos 1 first',
'Pos 1 second',
'Pos 1 A third',
'Pos 2 first',
'Pos 2 second',
'Pos 2 A third',
'Pos 10 first',
'Pos 10 second',
'Pos 10 A third'
] */
CodePudding user response:
For the second sort use match
on numbers within the string value, converted to Number
.
const sorted = [
'Pos 10 second',
'Pos 10 A third',
'Pos 10 first',
'Pos 1 second',
'Pos 1 A third',
'Pos 1 first',
'Pos 2 second',
'Pos 2 A third',
'Pos 2 first',
]
.sort((a, b) => a.includes(`first`) ? -1 : 1)
.sort((a, b) => a.match(/\d /) - b.match(/\d /));
document.querySelector(`pre`).textContent =
JSON.stringify(sorted, null, 2);
<pre></pre>