Javascript 字符串替换为计算

2024-03-27

有没有办法解决javascript中字符串中的数学表达式?例如,假设我想生成字符串“Tom has 2 apples, Lucy has 3 apples. Together they have 5 apples”,但我希望能够替换变量。我可以通过字符串替换来做到这一点:

string = "Tom has X apples, Lucy has Y apples. Together they have Z apples";
string2 = string.replace(/X/, '2').replace(/Y/, '3').replace(/Z/, '5');

然而,如果我可以使用 X+Y 而不是变量 Z,那就更好了。现在,我还可以对 X+Y 进行字符串替换,并将其替换为正确的值,但是当尝试处理我可能想做的所有可能的字符串内计算时,这会变得混乱。我想我正在寻找一种方法来实现这一目标:

string = "Something [X], something [Y]. Something [(X+Y^2)/(5*X)]";

并且将 [___] 部分理解为在替换回字符串之前要解析的表达式。

感谢您的帮助。


没有直接的内置方法(好吧,也许有 - 见下文),但如果您使用replace函数,其中替换可以是函数而不是字符串(返回值是替换的内容),您可以相当轻松地实现这一点。

例如,假设您使用 Ruby 表示法#{xyz}为你的占位符。此代码循环遍历这些:

var mappings, str;

str = "One #{X} three #{Y} five";
mappings = {
    "X": 2,
    "Y": 4
};
str = str.replace(/\#\{([^#]+)\}/g, function(match, key) {
    var result;

    result = mappings[key];
    /* ...processing here */
    return result;
});

结果字符串是One 2 three 4 five, 因为#{X} and #{Y}已通过查找替换。您可以查看该键,看看它是否是一个表达式,是否需要计算,而不是简单地查找。该评估才是您真正工作的所在。

现在轮到你could use with and eval实现表达支持;改变result = mapping[key];上面一行:

    with (mappings) {
        result = eval(key);
    }

如果你喂绳子"One #{X} three #{Y} five #{X + Y * 2}"对此,结果是One 2 three 4 five 10- 因为2 + 4 * 2 = 10.

这有效是因为with将给定对象粘贴在作用域链的顶部,因此这是解析不合格引用时检查的第一件事(例如X), and eval执行 Javascript 代码——因此可以计算表达式——并且在调用它的范围内神奇地执行此操作。但要小心;正如 Eric 指出的,并非所有运算符在各种表达形式上都是相同的,特别是 Javascript 解释^意思是“按位异或”,而不是“的幂”。 (它没有指数运算符;您必须使用Math.pow.)

但你需要非常小心这类事情with and eval(各自以自己的方式)可能会出现问题。但主要问题是with如果你做一项作业,你很难知道某样东西从哪里来,又会去哪里,而你却没有做;以及主要问题eval来自使用它来解释您无法控制的字符串。只要您采取适当的保护措施并意识到这些问题......

将其归结为一个函数:

function evaluate(str, mappings) {
    return str.replace(/\#\{([^#]+)\}/g, function(match, key) {
        var result;

        with (mappings) {
            result = eval(key);
        }

        return result;
    });
}
alert(evaluate(
    "The expression '(#{X} + #{Y}) * 2' equals '#{(X + Y) * 2}'",
    {"X": 2, "Y": 4}
)); // alerts "The expression '(2 + 4) * 2' equals '12'"
alert(evaluate(
    "The expression '(#{X} + #{Y}) * 2' equals '#{(X + Y) * 2}'",
    {"X": 6, "Y": 3}
)); // alerts "The expression '(6 + 3) * 2' equals '18'"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript 字符串替换为计算 的相关文章

随机推荐

  • HTML“object”标签是否有跨浏览器标准 onload 事件?

    我知道 IE 支持onreadystatechange属性上的object标签 但这似乎不是标准方式 因此所有其他浏览器都不支持它 更新 澄清一下 我不是在寻找 DOM Load 事件 而是在寻找object标签本身 例如object标签将
  • -bash:react-native:找不到命令

    我已经成功安装了brew node 4 0 watchman和flow 当我安装时我收到了以下信息npm install g react native cli Users home node bin react native gt User
  • Bower:安装后“未找到命令”

    当我执行时我似乎得到以下信息npm install bower g usr local share npm bin bower gt usr local share npm lib node modules bower bin bower
  • ADT 到 Android Studio 意外的顶级异常

    因此 我正在尝试将 Eclipse ADT 项目迁移到 Android Studio 中 我使用 appcompat v7 项目作为 eclipse 中的库项目 我按照 Android 开发网站上的说明进行操作 但仍然收到此错误 Error
  • `ejabberdctl start` 导致“内核 pid 终止”错误 - 我该怎么办?

    我用谷歌搜索了三个小时但没有结果 我有一个 ejabberd 安装 但不是使用 apt 安装的 它是从源代码安装的 其中没有名为 ejabberd 的程序 启动和停止 一切都是通过 ejabberdctl 进行的 它完美地运行了一个月 突然
  • CDN 上的 Dojo 与自己安装的 Dojo

    我使用了相当多的 Dojo 但迄今为止我仅通过包含来自 AOL Google 等 CDN 来使用它 托管 Dojo 副本而不是通过 CDN 使用它是否有优势 我没有太多需要改变代码库 但我想还有其他优点 缺点 通过托管您自己的 Dojo 环
  • Tornado 如何在任意位置提供单个静态文件?

    我正在使用 Tornado 开发一个简单的网络应用程序 它提供一些动态文件和一些静态文件 动态文件不是问题 但我在提供静态文件时遇到问题 我想做的是在访问 foo json URL 时提供文件 path to foo json 请注意 pa
  • Docker 输出中缺少层 ID

    我刚刚按照官方指南在 Ubuntu 上全新安装了 Docker https docs docker com engine installation linux ubuntulinux https docs docker com engine
  • Laravel 4 如何在视图中显示 Flash 消息?

    我正在尝试显示我的闪存消息 这是我的路由文件中的 Route post users groups save function return Redirect to users groups gt withInput gt with succ
  • RemoteServiceServlet 和 RemoteService 有什么区别?

    我知道第一个是类 第二个是接口 但重点是 为什么客户服务应该扩展远程服务并为服务实现类扩展远程服务Servlet 那么幕后到底是什么 您正在尝试比较苹果和橙子 请阅读docs https developers google com web
  • 是否有一个运算符可以作为 concatMap 但具有多个内部可观察值

    我正在使用可观察的对象来查询我的数据库 该可观察对象将返回一个数组 其中包含找到的所有匹配对象 我的问题是我想将可观察值映射到我将从另一个 API 检索的更多详细信息 我尝试了 concatMap 但它只让我在初始可观察值中嵌套 1 个可观
  • 测试互联网连接的最快方法

    C 2008 SP1 我正在使用此代码连接到我们的客户网站 这是针对软件电话应用程序的 在用户拨打电话之前 软件电话必须测试是否存在有效的互联网连接 因此 我要做的就是使用 httpWebRequest 类连接到我们的客户网站 如果响应正常
  • iPhone 电子邮件应用程序启动 URL

    在 iPhone 上启动电子邮件和开始新电子邮件的 URL 是 mailto 电子邮件受保护 cdn cgi l email protection 我只想启动电子邮件应用程序 将用户放在主菜单或收件箱中 mailto 开始撰写新的空白电子邮
  • 在谷歌应用程序脚本中解析 html 的最佳方法是什么

    var page UrlFetchApp fetch contestURL var doc XmlService parse page 上面的代码在使用时会出现解析错误 但是如果我用已弃用的 Xml 类替换 XmlService 类 并设置
  • 跟踪文件(Windows 终端)的硬链接(重新分析点?)?

    如何跟踪文件的硬链接 重新分析点 管道传输到格式列表不会显示目标 至少在 powershell 7 中 你会得到一个小 ascii 箭头 该文件夹位于 env path 中 如果您没有 Windows 终端 则 MicrosoftEdge
  • 权限是不可更改的权限类型

    背景 我正在尝试新的 Tiles 和 TileService 并决定重新创建 USB Tethering 磁贴CyanogenMod https github com CyanogenMod android frameworks base
  • 现在N层架构意味着什么?

    从传统意义上讲 N 层意味着将应用程序分成 层 并将每个 层 放在不同的服务器上 这样做至少有 3 个原因 维护 a 代码维护 更容易进行错误修复和功能添加 b 硬件维护 关闭一台服务器不会中断其他层的服务 性能 一台服务器的速度通常不够快
  • Python - 在这种情况下列表理解是否有效?

    这是Python中的输入 脏 列表 input list n data1 n data2 n n data3 n 每个列表元素包含带有换行符的空格或带有换行符的数据 使用下面的代码清理它 cleaned up list data strip
  • 在 Archlinux 上通过 Pyenv 编译 Python 但缺少 OpenSSL

    我正在尝试在新安装的 ArchLinux 上通过 pyenv 安装 python pyenv install 3 5 1Downloading Python 3 5 1 tar xz gt https www python org ftp
  • Javascript 字符串替换为计算

    有没有办法解决javascript中字符串中的数学表达式 例如 假设我想生成字符串 Tom has 2 apples Lucy has 3 apples Together they have 5 apples 但我希望能够替换变量 我可以通