Скажем, у меня есть такая строка:
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.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Самый маленький способ, вероятно, использовать комбинацию 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);
}
Что вы имеете в виду под оператором запятой?
Я неправильно прочитал ваш код, но это запятая: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Мне непонятно понравился ОП или нет? :)
Почему бы и нет?
Это, наверное, лучший ответ. Меня просто раздражает то, что я никогда не думал о повторении такой строки, особенно таким образом, чтобы это работало со строкой const. Хороший ответ!
@SebastianSpeitel, может быть, подумай об этом немного сложнее
@MrCholo Вам грустно, что вы не можете использовать строки шаблона, может быть, вы не можете использовать какой-либо es6?
@SebastianSpeitel, ваш ответ идеален, но не хватает одного
Используете %s в качестве ключа?
Нет, как я уже сказал, твой ответ идеален
Извини я не понимаю
Мне кажется, что у него было все, что вы хотели от @MrCholo - понятия не имею, о чем вы говорите.
Я создал хорошо отформатированный вопрос, за который вы получили 4+ голоса, обычная вежливость предлагает вернуть услугу - вот еще один связанный с этим вопрос, если вы хотите продолжить свои завоевания: stackoverflow.com/questions/53421730/…
Вам нужен только один ?
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))Интересный ответ! Это одно закрытие типа странный
вероятно, неплохо было бы сделать заметку об операторе запятой или объяснить это в комментариях здесь. Шучу, это не оператор запятой.