Reputation: 1306
I have an string, but at certain points in the string it has dynamic values. I want to find those points in the string and replace them with values from an array.
Let's say I have:
var array = ['string', 'value'];
var string = 'This is a {1}, and this is a {2}.';
Now I need to figure out a way to replace {1}, with the value of the first index in the array and replace {2} with the value of the second index of the array.
So the string would like this:
This is a string, and this is a value.
This seems so simple, but I am breaking my head on this. I can't find a way to do this easily.
Upvotes: 0
Views: 342
Reputation: 64923
You can use Array.prototype.reduce
:
var StringHelper = {
format: function(format, args) {
return args.reduce(function(result, currentReplace, currentReplaceIndex) {
result = result.replace("{" + (currentReplaceIndex + 1) + "}", args[currentReplaceIndex]);
return result;
}, format);
}
};
var sourceString = "My name is {1} and I'm {2} years old";
var replaceItems = ["Matías", "31"];
var parsedString = StringHelper.format(sourceString, replaceItems);
alert(parsedString);
It's a good alternative to regular expressions, and I'm not absolutely sure if I did a jsPerf test in the right way, but it shows that this approach outperforms the regular expression one.
Upvotes: 1
Reputation: 288130
You can use replace
with a regular expression and a function:
string.replace(/{(\d+)}/g, function(match, n) {
return array[n-1];
});
You can also check n < 1 || n > array.length
to provide a fallback value in case the number is out of bounds.
Alternatively, the new ES6 way is using tagged template strings
function tag(strings, ...values) {
var parts = [];
for(var i=0; i<strings.length; ++i)
parts.push(strings[i], array[values[i]-1]);
return parts.join('');
}
tag`This is a ${1}, and this is a ${2}.`
Upvotes: 5
Reputation: 3593
like this
string.replace(/\{(\d+)\}/g, function(m, n){
return array[n-1]
})
Upvotes: 1