Для меня сладость заключается в использовании некоторых утилит, которые вы можете получить из lodash, ramda или любой другой слегка «функциональной» библиотеки, но с сохранением логики [ a, f(b, c, d, e) ]
в обычной функции стрелки.(может быть личным предпочтением)
Необходимые шаги:
- Разделить строку на один массив строк (я использую
split("&")
) - Разделитьмассив строк в массив массивов из 5 строк (
chunk(5)
) - вызов
flatMap
для внешнего массива - Сопоставление внутренних массивов с использованием
([ head, ...tail]) => [ head, f(...tail) ]
, где f
ваша "волшебная" функция
// Utils
const range = s => Array.from(Array(Math.floor(s)), (_, i) => i);
const chunk = n => xs => range(xs.length / n)
.map(i => xs.slice(i * n, i * n + n));
const split = del => str => str.split(del);
const flatMap = f => xs => xs.flatMap(f);
const pipe = (...fs) => x => fs.reduce((y, f) => f(y), x);
// App
const myMagic = (one, two, three, four) => `this is ${one} and ${two} and ${three} and ${four} as usual`
const convert = pipe(
split("&"),
chunk(5),
flatMap(([ head, ...tail ]) => [ head, myMagic(...tail) ])
);
// Run it
const input = "HELLO1&ho&hy&hu&hq&HELLO2&ho&hy&hu&hq&HELLO3&ho&hy&hu&hq&HELLO4&ho&hy&hu&hq&hx";
console.log(convert(input));