Одним из способов может быть использование Карта и использование имен в качестве ключа и значения в качестве числа.
Затем извлеките ключи из карты, расположите их так, чтобысамая длинная строка стоит первой и создайте регулярное выражение с группой захвата и чередованием
Регулярное выражение в конечном итоге будет выглядеть так:
(three|seven|eight|four|five|nine|one|two|six|o)
Затем разделите строку с помощью этого регулярного выражения,Сопоставьте элементы, удалив все нецифровые символы, если на карте нет ключа, и удалите все пустые значения из массива.
В конце получите значение из карты, используя ключ.
let map = new Map([
["o", 0],
["one", 1],
["two", 2],
["three", 3],
["four", 4],
["five", 5],
["six", 6],
["seven", 7],
["eight", 8],
["nine", 9]
]);
let regex = new RegExp("(" + [...map.keys()]
.sort((a, b) => b.length - a.length)
.join('|') + ")");
let strings = [
"69ooooneotwonine",
"o",
"testninetest",
"10001",
"7xxxxxxx6fivetimesfifefofourt",
"test"
].map(s =>
s.split(regex)
.map(x => !map.has(x) ? x.replace(/\D+/, '') : x)
.filter(Boolean)
.map(x => map.has(x) ? map.get(x) : x)
.join(''));
console.log(strings);