Нет ничего плохого в вашем решении. Если вы можете писать похожие функции сортировки, вы можете использовать обобщенную функцию c, передавая функции соответствия.
const sortArray = (arr, key, rgx, bothMatched, neitherMatched, onlyAMatched, onlyBMatched) => {
const compare = (a, b) => {
const aval = a[key] || "";
const bval = b[key] || "";
const amatched = aval.match(rgx);
const bmatched = bval.match(rgx);
if (amatched) {
if (bmatched) {
return bothMatched(aval,bval);
}
return onlyAMatched(a,b);
}
if (bmatched) {
return onlyBMatched(a,b)
}
return neitherMatched(aval,bval);
};
return arr.sort(compare);
};
const arr = [
{key: "key1", label: "1"},
{key: "key2", label: "3"},
{key: "key3", label: "2"},
{key: "key4", label: "Second"},
{key: "key5", label: "First"}
]
const key = 'label';
console.log("----- match like OP -----");
sortArray(
arr,
key,
/[a-zA-Z]/i,
(a,b) => a.localeCompare(b),
(a,b) => a.localeCompare(b),
() => -1,
() => 1)
.forEach(e => console.log(JSON.stringify(e)));
console.log("----- Alternative match -----");
sortArray(
arr,
key,
/^[\d]+$/,
(a,b) => parseInt(a,10) - parseInt(b,10),
(a,b) => a.localeCompare(b),
() => 1,
() => -1)
.forEach(e => console.log(JSON.stringify(e)));
console.log(".");