Вы можете создать функцию, которая принимает входной массив, строку и функцию, которая принимает текущее значение .findIndex()
для сортировки результирующего массива и значения строки, которое передается конструктору RegExp
, где параметры функции могутбыть настроен так, чтобы использовать присвоение деструктурирования для соответствия определенному имени свойства во входном массиве объектов, с .splice()
, используемым для удаления соответствующего элемента из массива, или остатка от входного массива.
const regexSort = (arr, value, fn) => {
const res = [];
for (let i; (i = arr.findIndex(v => fn(v, value))) > -1; res.push(arr.splice(i, 1)[0]));
return [...res, ...arr];
}
const a = ["abc", "abcd", "xyz", "abcdef", "qrst", "abcg"];
const b = [
{text: "abc", color: "blue"},
{text: "abcd", color: "red"},
{text: "xyz", color: "yellow"},
{text: "abcdef", color: "gold"},
{text: "qrst", color: "green"},
{text: "abcg", color: "brown"}
];
let value = "abc";
// array of strings
console.log(
regexSort(a, value, (key, value) => new RegExp(`^${value}`, `i`).test(key))
);
// array of objects, destructure `text` property assign to `key`
console.log(
regexSort(b, value, ({text: key}, value) => new RegExp(`^${value}`, `i`).test(key))
);