如何用数组的值替换字符串中的问号?

时间:2012-01-19 17:57:57

标签: javascript jquery string underscore.js

给定字符串'Hello ?, welcome to ?'和数组['foo', 'bar'],如何使用JavaScript(可能使用jQuery,Underscore等)在单行代码中获取字符串'Hello foo, welcome to bar'

5 个答案:

答案 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的变体。