Я сделаю это за два шага .На первом этапе создается объект с keys
(буквы алфавита) и totals
(сумма чисел) для каждого key
.Для этого мы используем String :: split () и Array :: redu () в указанном порядке.Пример сгенерированного объекта будет выглядеть следующим образом:
{"hc": 22, "op": 19, ...}
Второй шаг просто форматирует предыдущий сгенерированный объект в желаемую строку вывода.Для этого мы используем Object.entries () , Array :: map () и, наконец, Array :: join () .
const input = "a+20hc+2a+2hc+9op+330o+10op";
// First, get keys and sum their total.
let res = input.split("+")
.reduce((acc, curr) =>
{
let [match, val, key] = curr.match(/(\d*)(\w*)/);
val = +val || 1;
acc[key] = acc[key] ? acc[key] + val : val;
return acc;
}, {});
console.log(res);
// Now, format to the output string.
res = Object.entries(res).map(([x, y]) => y + x).join("+");
console.log(res);
Однако вы должны заметить, что предыдущий подход не будет работать, если у вас есть subtractions
, но некоторые незначительные изменения могут сделать эту работу:
const input = "-4a+20hc+2a+2hc+9op+330o+10op-340o";
// First, get keys and sum their total.
let res = input.split(/\+|(?=-)/)
.reduce((acc, curr) =>
{
let [match, val, key] = curr.match(/(-*\d*)(\w*)/);
val = +val || 1;
acc[key] = acc[key] ? acc[key] + val : val;
return acc;
}, {});
console.log(res);
// Now, format to the output string.
res = Object.entries(res)
.map(([x, y]) => y + x)
.join("+")
.replace(/\+-/, "-");
console.log(res);