Как указала Николас Тауэр, эта ошибка была простым переносом.Моя версия заключалась бы в том, чтобы обернуть этот императивный код внутри функции, чтобы я мог написать что-то вроде этого:
const fillIn = (fields, place_holders, vals) => reduce(
(str, {Key, Val}) => replace(Key, Val, str),
place_holders,
zipWith((Key, Val) => ({Key, Val}), fields, vals)
)
const place_holders = "GREETINGS-{year}-{mm-month}-{dd-day} - HELLO WORLD";
let fields = ['{year}', '{mm-month}', '{dd-day}'];
let vals = ['2016', '06', '23'];
console.log(fillIn(fields, place_holders, vals))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
<script>
const {reduce, replace, zipWith} = R
</script>
Я мог бы также обернуть это в curry
, если бы я хотел частично применить поля (и, возможно, заполнитель).
Обновление : возможно, вы захотите рассмотреть другую структуру данных.Использование двух массивов для хранения парных значений на основе общих индексов часто является хрупким.Эта структура содержит ту же информацию более надежным образом:
{year: '2016', 'mm-month': '06', 'dd-day': '23'}
Использование этой функции также позволяет более динамично работать с заполнителями, используя регулярное выражение:
const fillIn = (placeHolder, context) => placeHolder.replace(
/\{([^}]+)\}/g,
(s, key) => key in context ? context[key] : `{${key}}`
)
const context = {year: '2016', 'mm-month': '06', 'dd-day': '23'}
console.log(fillIn("GREETINGS-{year}-{mm-month}-{dd-day} - HELLO WORLD", context))
console.log(fillIn("GREETINGS-{foobar}-{mm-month}-{dd-day} - HELLO WORLD", context))
Есть обратная сторона этого.Это не удастся, если у вас есть вложенные фигурные скобки в вашей строке.Я бы на самом деле использовал шаблоны, более похожие на шаблоны встроенных строк "GREETINGS-${year}-${mm-month}-${dd-day} - HELLO WORLD"
, чтобы избежать этой проблемы и сделать их лучше выделенными.Эти дополнительные $
также должны быть добавлены к регулярному выражению, но это легко: /\$\{([^}]+)\}/g
.
Эта техника может вам не помочь.Если эти структуры данных поступают из внешней системы, то вы застряли.Но если вы контролируете их, подумайте, что это, возможно, более гибкая и надежная версия того, что вы уже получили.