Создать строковый шаблон и заменить его содержимым массива

Скажем, у меня есть такая строка:

const m = 'Map<?,?>';

и такой массив:

const types = ['string', 'boolean'];

и я хочу сгенерировать:

const r = 'Map<string,boolean>'

Как мне это сделать? Примечание, что мне не нужно использовать вопросительный знак в строке шаблона, я могу использовать другой символ, может быть, вот так:

const m = 'Map<%s,%s>';

Также, пожалуйста, Примечание, что я не может использовать строки шаблона ES6 такого рода ${}, потому что мой шаблон не заключен в функцию.

Я считаю, что это сработает в Node.js:

util.format(m, ...types);

но я думаю, что я ищу способ использовать знак вопроса (?) вместо использования% s.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
91
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Самый маленький способ, вероятно, использовать комбинацию reduce и replace.

Заменить заменяет только первую найденную позицию, а сокращение упрощает итерацию по заданным заменам.

const m = 'Map<?,?>';

const types = ['string', 'boolean'];

const n = types.reduce((n, t) => n.replace('?', t), m);
console.info(n);

Или формализовать его в функцию:

function format(str, key, replacements){
    return replacements.reduce((s, t) => s.replace(k, t), str);
}

вероятно, неплохо было бы сделать заметку об операторе запятой или объяснить это в комментариях здесь. Шучу, это не оператор запятой.

user5047085 21.11.2018 23:42

Что вы имеете в виду под оператором запятой?

Sebastian Speitel 21.11.2018 23:42

Я неправильно прочитал ваш код, но это запятая: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

user5047085 21.11.2018 23:43

Мне непонятно понравился ОП или нет? :)

user5047085 21.11.2018 23:47

Почему бы и нет?

Sebastian Speitel 21.11.2018 23:51

Это, наверное, лучший ответ. Меня просто раздражает то, что я никогда не думал о повторении такой строки, особенно таким образом, чтобы это работало со строкой const. Хороший ответ!

zfrisch 21.11.2018 23:52

@SebastianSpeitel, может быть, подумай об этом немного сложнее

user5047085 21.11.2018 23:52

@MrCholo Вам грустно, что вы не можете использовать строки шаблона, может быть, вы не можете использовать какой-либо es6?

Sebastian Speitel 21.11.2018 23:54

@SebastianSpeitel, ваш ответ идеален, но не хватает одного

user5047085 21.11.2018 23:55

Используете %s в качестве ключа?

Sebastian Speitel 21.11.2018 23:56

Нет, как я уже сказал, твой ответ идеален

user5047085 21.11.2018 23:56

Извини я не понимаю

Sebastian Speitel 21.11.2018 23:58

Мне кажется, что у него было все, что вы хотели от @MrCholo - понятия не имею, о чем вы говорите.

zfrisch 22.11.2018 00:03

Я создал хорошо отформатированный вопрос, за который вы получили 4+ голоса, обычная вежливость предлагает вернуть услугу - вот еще один связанный с этим вопрос, если вы хотите продолжить свои завоевания: stackoverflow.com/questions/53421730/…

user5047085 22.11.2018 00:11

Вам нужен только один ?

const types = ['string', 'boolean'];

console.info('Map<?>'.split('?').join(types))

или

const types = ['string', 'boolean'];

console.info('Map<?>'.replace('?', types))

или если вы хотите сохранить ?,?

const types = ['string', 'boolean'];

console.info('Map<?,?>'.replace('?,?', types))

Вы также можете использовать replace() напрямую с небольшой затейливой работой по закрытию для захвата индекса (который, к сожалению, не передается в функцию обратного вызова replace):

const m = 'Map<?,?>';
const types = ['string', 'boolean'];

let rep = m.replace(/\?/g, ((i) => () => types[i++])(0)) // i is simple a count of matches starting at 0
console.info(rep)

Если немедленно выполняемая функция выглядит слишком странно, вы можете обернуть все это как простую функцию, которая немного проще для глаз:

const m = 'Map<?,?>';
const types = ['string', 'boolean'];

function replaceMatch(str, arr){
    let i = 0
    return str.replace(/\?/g, () => arr[i++])
}

console.info(replaceMatch(m, types))

Интересный ответ! Это одно закрытие типа странный

zfrisch 22.11.2018 00:01

Другие вопросы по теме