使用字符串键访问或创建嵌套 JavaScript 对象而不使用 eval

2024-03-12

我正在寻找一个很好的解决方案来通过字符串值访问属性,但如果该属性不存在,则应该创建它。如果根结构已经定义了该结构的某些部分,则不应覆盖这些属性,而应合并这些属性。

例如,如果您有一个空对象test并且您想在不使用 eval 的情况下设置深层结构。例如

test = {}
test.foo.name = "Hallo" // <<- foo is an Object
test.foo[3] = "Test" // <<- foo should remain as Object, not as Array 
test.foo.data[3].bar = 100 // <<- should not overwrite test.foo.name

我已经编写了一个实际有效的解决方案,但我猜这是相当糟糕的代码:

也可以作为 jsfiddle 使用:https://jsfiddle.net/gvaLzqqf/4/ https://jsfiddle.net/gvaLzqqf/4/

Object.setValue = function(node, flatKey, value) {
    flatKey = flatKey.replace("[", ".");
    flatKey = flatKey.replace("]", "");
    var parts = flatKey.split(".")
    var oldNode = node
    parts.forEach(function(key, index) {
      if (/^\+?(0|[1-9]\d*)$/.test(key)) {
        key = key * 1
        if (index > 0) {
          var oldValue = parts[index - 1]
          if (!Array.isArray(oldNode[oldValue])) {
            oldNode[oldValue] = []
            node = oldNode[oldValue]
          }
        }
      }
      if (node[key] == undefined) {
        node[key] = {}
      }
      oldNode = node
      node = node[key]
    }); // for each
    oldNode[parts[parts.length - 1]] = value
    return oldNode[parts[parts.length - 1]]
  } // function

var test = {}
Object.setValue(test, "foo.name", "Mr. Foo")
Object.setValue(test, "foo.data[0].bar", 100)
Object.setValue(test, "and.another[2].deep", 20)

console.log("test = " + JSON.stringify(test))
console.log("test.foo.data[0].bar = " + test.foo.data[0].bar)

然而,有没有更好的方法来实现这一目标?


您可以通过行走给定的对象来分割路径并减少路径。如果不存在对象,则使用名称或数组创建一个新属性。稍后赋值。

function setValue(object, path, value) {
    var way = path.replace(/\[/g, '.').replace(/\]/g, '').split('.'),
        last = way.pop();

    way.reduce(function (o, k, i, kk) {
        return o[k] = o[k] || (isFinite(i + 1 in kk ? kk[i + 1] : last) ? [] : {});
    }, object)[last] = value;
}

var test = {};
setValue(test, "foo.name", "Mr. Foo");
setValue(test, "foo.data[0].bar", 100);
setValue(test, "and.another[2].deep", 20);
console.log(test);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用字符串键访问或创建嵌套 JavaScript 对象而不使用 eval 的相关文章

随机推荐

  • 从Excel VBA的下拉列表中选择特定项目

    我正在为我的办公室设计一个仪表板 这一切都有效 但我想添加一个选项 而不是在下拉列表中搜索 250 多个项目 您还可以单击一个单元格 下拉列表将更改为该值 并且分配的宏将为该下拉列表运行 到目前为止 我不知道如何让 vba 从下拉列表中选择
  • 具有列表视图的 Android 小部件正在刷新具有丑陋的短“闪烁”效果的项目

    我想制作一个带有 ListView 的小部件 您可以在其中添加 listItems 来显示计数器计时器 以查看您有多少时间来处理某个事件 这是我第一次使用小部件 我不知道我的方法是好还是坏 到目前为止我得到了这个 AppWidgetProv
  • Javascript - 所有嵌套的 forEach 循环完成后的回调

    我确信这是一个相当简单的任务 但我现在无法全神贯注 我有一组嵌套的 forEach 循环 当所有循环运行完毕时 我需要一个回调 我愿意使用 async js 这就是我正在处理的 const scanFiles function accoun
  • 如何使用 BiWeekly 库和 Java Mail API 创建现有事件并发送更新?

    我在用着BiWeekly http sourceforge net projects biweekly 库来创建 VEVENT 然后使用以下命令发送它Java 邮件 API https java net projects javamail
  • 具有动态数量的并行消费者的 Kafka 工作队列

    我想用Kafka来 分工 我想将工作实例发布到某个主题 并运行由相同使用者组成的云来处理它们 当每个消费者完成其工作时 它将从该主题中提取下一个工作 每项工作只能由一个消费者处理一次 处理工作非常昂贵 因此我需要在许多机器上运行许多消费者才
  • New (std::nothrow) 与 try/catch 块中的 New

    学习后我做了一些研究new 不像malloc 我习惯了 分配失败时不会返回 NULL 并且发现有两种不同的方法来检查 new 是否成功 这两种方式是 try ptr new int 1024 catch std bad alloc exc
  • PayPal 自适应付款错误 您无权隐式执行此付款

    我有一个发送付款的简单应用程序 该应用程序在沙箱中运行良好 实时经典应用程序的应用程序 ID 已获得批准 显示为 自动批准 但当我输入实时凭据时 它返回错误 您无权隐式执行此付款 发送 XML 到端点https svcs paypal co
  • 在钩子 woocommerce_checkout_order_processed 中获取订单详细信息

    add action woocommerce checkout order processed send order fax function send order fax order id print r REQUEST die 我想在这
  • JavaScript 异步返回值/使用 jQuery 赋值[重复]

    这个问题在这里已经有答案了 我有以下 jQuery 函数 我正在尝试返回此处显示的 GUID 值alert 警报工作正常并且值已填充 但是我似乎无法将其分配给变量并返回其值 最终我需要访问其他函数中的GUID值等 我尝试过的所有内容都仅显示
  • 不可变对象是线程安全的,但为什么呢?

    举例来说 一个线程正在通过创建不可变类的对象来创建和填充不可变类的引用变量 而另一个线程在第一个线程完成并创建不可变类的另一个对象之前启动 那么不可变类的用法不是线程吗不安全 创建不可变对象还意味着所有字段都必须标记为final 如果引用了
  • Linq to SQL - 关闭代码中的 UpdateCheck

    我想关闭UpdateCheck所有成员的功能 除了他们的主键 现在我按照下面的示例作为指导 但是我的表的 MetaDataMembers 仍然设置为Always http www the lazy coder com 2013 04 set
  • System.ArgumentException'jobobject' 不得为 IntPtr.Zero。参数名称:jobobject

    我收到一个错误 我无法理解 我在 void 方法中有这个简单的警报对话框生成器 private void startAction AlertDialog Builder builder builder new AlertDialog Bui
  • 如何使用 PowerShell 检查是否启用了 Hyper-V?

    我正在尝试编写一个 PowerShell 脚本来检查 Windows 可选功能以查看是否安装了 Hyper V 但是 我的代码不起作用 即使 Hyper V 已禁用 脚本也会输出它已启用的信息 Requires RunAsAdministr
  • 将 MySQL 服务器连接到 NetBeans

    我正在尝试在 Netbeans 中连接 MySQL 数据库 但停留在第一步 连接数据库 我的数据库在控制台上工作正常 尝试命令 mysqladmin u root p ping 它说 mysql id 还活着 我什至从控制台创建了数据库 现
  • 从 3D 平面到平行于图像平面的平面的单应性

    我有一张图像 其中场景中有一个校准目标 已知几何形状 假设桌子上有一个简单的 2 x 2 正方形 我想执行透视变换 使用warpPerspective 以便生成的图像是桌子的正交视图 就好像相机轴与桌子法线平行 计算单应性的标准过程是从一个
  • 从字符串中删除每个第 n 个元素

    如何删除字符串中的每第 n 个元素 我猜你会使用drop以某种方式发挥作用 就像这样删除第一个 n 你怎么能改变它 只删除第 n 个 然后是后面的第 n 个 依此类推 而不是全部 dropthem n xs drop n xs 简单的 取
  • 脚本在 上时不起作用

    我证明了剧本 它的作品 但在 我不擅长剧本 也许这是一个简单的问题 基本上 脚本只是显示 当鼠标悬停在图像上时 img1 mouseover functi
  • 字节顺序、“最高有效”和“最低有效”

    我在网上阅读了描述大端和小端的描述 然而 它们似乎基本上都以相同的方式读取 我仍然对 最多 和 最少 有效字节的实际实现感到困惑 据我了解 小端值首先评估 最低有效 值 而在大端值下 首先评估 最高有效 字节 但是 我不清楚 最 和 最不
  • 为什么类不能用作模块?

    Module是的超类Class Class superclass gt Module 在面向对象编程中 这意味着Class可以在任何有实例的地方使用Module可以使用 令人惊讶的是 情况并非如此ClassRuby 中的实例 class C
  • 使用字符串键访问或创建嵌套 JavaScript 对象而不使用 eval

    我正在寻找一个很好的解决方案来通过字符串值访问属性 但如果该属性不存在 则应该创建它 如果根结构已经定义了该结构的某些部分 则不应覆盖这些属性 而应合并这些属性 例如 如果您有一个空对象test并且您想在不使用 eval 的情况下设置深层结