JavaScript中与Python的%s相当的内容是什么?

3

我最近在学习NodeJS,之前几年一直在使用Python。

在Python中,我能够将一个带有动态参数的字符串保存在JSON中,并在加载该字符串时设置它们,例如:

我的JSON:

j = {
"dynamicText": "Hello %s, how are you?"
}

然后像这样使用我的字符串:
print(j['dynamicText'] % ("Dan"))

所以Python会用"Dan"替换%s

我正在寻找JS的等价方法,但找不到。有什么想法吗?

** 忘了提一下:我想将JSON保存为另一个配置文件,所以字面量在这里行不通。


Template_literals - charlietfl
s => \Hello ${s}, how are you?`` - ASDFGerte
我所知道的唯一方法是使用一个带参数并返回对象的函数(在这种情况下,将要传递的名称作为参数)。 - manAbl
@ASDFGerte 谢谢,但我想将这个JSON保存为单独的文件。 - Dan Monero
似乎只是 j['dynamicText'].replace('s%', 'Dan') 的语法糖。 - Slai
可能是 NodeJS 字符串格式化像 Python 一样? 的重复问题。 - Frax
5个回答

4

在JavaScript中没有预定义的方式,但你仍然可以实现以下类似的效果。这是我在现有应用程序中完成的。

function formatString(str, ...params) {
    for (let i = 0; i < params.length; i++) {
        var reg = new RegExp("\\{" + i + "\\}", "gm");
        str = str.replace(reg, params[i]);
    }
    return str;
}

现在formatString('You have {0} cars and {1} bikes', 'two', 'three')返回'You have two cars and three bikes'

如果字符串中{0}多次出现,则都被替换。

例如:formatString('You have {0} cars, {1} bikes and {0} jeeps', 'two', 'three')变成"You have two cars, three bikes and two jeeps"

希望这可以帮到你。


在 Node 中有 util.format(),所以你的回答相当不准确,尽管它对于浏览器 JS 是正确的。 - Frax
是的,Node.js 中确实有 .format 方法,但您能告诉我为什么这在 Node.js 中不准确吗?您的意思是这会在 Node.js 中出错吗? - ngChaitanya
我的评论是针对“JavaScript中没有预定义的方法”这句话的,因为在Node中有一种预定义的方法。你的代码仍然可以正常工作,但在这种情况下会有点重复造轮子。 - Frax

4
使用模板字面量。这是比较新的方法,可能不支持旧版本的浏览器。

var test = "Dan"
var j = {
  "dynamicText": `Hello ${test}, how are you?`
}

console.log(j["dynamicText"])

或者你可以创建一个函数,在该函数内使用 string.replace 方法来替换一个单词为新单词。

var test = "Dan"
var j = {
  "dynamicText": "Hello %s, how are you?"
}

function replace(toReplaceText, replaceWith) {
  let objText = j["dynamicText"].replace(toReplaceText, replaceWith);
  return objText;
}


console.log(replace('%s', test))


是的,但我的问题是我想将这个JSON分开保存,而不需要先定义变量。 - Dan Monero

1
你可以使用正则表达式和String.replace方法编写一个String.format方法:
String.prototype.format = function() {
    var args = arguments;
    return this.replace(/{(\d+)}/g, (match, p1) => {
        var i = parseInt(p1);
        return typeof args[i] != 'undefined' ? args[i] : match;
    });
}

接下来,运行:

console.log("{0}{1}".format("John", "Doe"));

将输出:John Doe

当然,如果您不喜欢编辑您不拥有的对象的原型(这通常是一个好习惯),您可以只创建一个函数:

var format = function(str) {
    var args = arguments;
    return str.replace(/{(\d+)}/g, (match, p1) => {
        var i = parseInt(p1);
        return typeof args[i+1] != 'undefined' ? args[i+1] : match;
    });
}

由于某些原因,我收到了“格式不是函数”的错误。 - Dan Monero
@DanMonero 好的,我忘记了那是我使用的自定义函数。对此很抱歉,我现在已经修复了。 - gtsiam

0
我找到了一个非常好的 npm 模块,正好满足了我的需要 - string-format

NPM中的String-Format


0

如果你想要一些不错的替代方案,可以看看JavaScript的printf/string.format等效函数

虽然它是在寻找JS中类似于C的printf()函数,但这些答案也适用于你的问题,因为Python的格式化字符串受到C的启发。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接