给定字符串'Hello ?, welcome to ?'
和数组['foo', 'bar']
,如何使用JavaScript(可能使用jQuery,Underscore等)在单行代码中获取字符串'Hello foo, welcome to bar'
?
答案 0 :(得分:21)
var s = 'Hello ?, welcome to ?';
var a = ['foo', 'bar'];
var i = 0;
alert(s.replace(/\?/g,function(){return a[i++]}));
答案 1 :(得分:7)
把这一切都放在一条线上有点傻,但是:
var str = 'Hello ?, welcome to ?',
arr = ['foo', 'bar'],
i = 0;
while(str.indexOf("?") >= 0) { str = str.replace("?", arr[i++]); }
答案 2 :(得分:3)
您可以使用vsprintf。虽然如果你包括sprintf,它不止一行。
vsprintf('Hello %s, welcome to %s', [foo, bar]);
答案 3 :(得分:1)
let str = 'Hello ?, welcome to ?'
let arr = ['foo', 'bar']
const fn = Array.prototype.shift.bind(arr)
let result = str.replace(/\?/g, fn)
console.log(result);
答案 4 :(得分:1)
让我们构建一个replaceWith
函数:
const replaceWith =
(...str) =>
(fallback) =>
str.length === 0
? fallback
: str.shift();
这是一个经过管理的函数:它接收替换字符串列表并返回另一个函数,该函数将逐个返回替换项:
const replacements = replaceWith('?', '?', '?');
replacements(); //=> '?'
replacements(); //=> '?'
replacements(); //=> '?'
在第三个呼叫之后,您已经用尽了所有替换项,因此下一个呼叫将返回undefined
或您作为fallback
参数传递的内容:
replacements(); //=> undefined
replacements('?'); //=> '?'
如果您要替换的子字符串比替换字符串多,则此fallback
参数会很方便。 (但是我们稍后会谈到。)
现在使用replaceWith
,我们可以做到:
'Hello ?, welcome to ?'.replace(/\?/g, replaceWith('foo', 'bar'));
//=> 'Hello foo, welcome to bar'
在幕后,它使用以下命令调用replaceWith
返回的函数(简称为fn
):
fn('?'); //=> 'foo'
fn('?'); //=> 'bar'
在仍然有替换字符串的情况下,将忽略fallback
参数(即本例中的占位符'?'
)。但是,当占位符多于替换符时,它将按原样返回:
'Hello ? and ?, welcome to ?'.replace(/\?/g, replaceWith('foo', 'bar'));
//=> 'Hello foo and bar, welcome to ?'
确认
此答案是Alex Varghese excellent answer的变体。