【问题标题】:Set value in JSON by a path using lodash or underscore通过使用 lodash 或下划线的路径在 JSON 中设置值
【发布时间】:2013-04-08 09:20:07
【问题描述】:

我想使用类似"a.0.b" 的路径字符串在 JSON 中设置值,以获取如下所示的 JSON:

{
  a: [
    {
      b: 'c'
    }
  ]
}

我想出了这个解决方案,但我想知道是否有更简单的方法来写这个:

function setValue(path, value, json) {
  var keys = path.split('.');
  _.reduce(keys, function(obj, key, i) {
    if (i === keys.length - 1) {
      obj[key] = value;
    } else {
      return obj[key];
    }
  }, json);
}

所以调用setValue('a.0.b', 'd', {a:[{b:'c'}]}) 会将json 更改为{a:[{b:'d'}]}

【问题讨论】:

  • 仅供参考,JSON 是一种文本数据交换格式。您在问题中指的是(嵌套的)JavaScript 对象/数组。
  • 那么你想设置像a[0].b = 1;这样的变量,还是我完全错了?
  • setvalue 中将传递路径字符串、新值和值应该更改的json。用一个例子更新了问题。
  • 在您的示例中,a 数组不包含 '0'(字符串)的键。您必须将字符串转换为整数才能访问 a 数组的第一个索引。
  • 为了明确贴出的功能效果很好,我只是想知道功能是否可以简化。

标签: javascript json underscore.js lodash


【解决方案1】:

这里有一个解决方案。我对这两种可能的解决方案进行了基准测试,似乎循环对象和路径比使用 reduce 函数更快。在此处查看 JSPerf 测试:http://jsperf.com/set-value-in-json-by-a-path-using-lodash-or-underscore

function setValue(path, val, obj) {
  var fields = path.split('.');
  var result = obj;
  for (var i = 0, n = fields.length; i < n && result !== undefined; i++) {
    var field = fields[i];
    if (i === n - 1) {
      result[field] = val;
    } else {
      if (typeof result[field] === 'undefined' || !_.isObject(result[field])) {
        result[field] = {};
      }
      result = result[field];
    }
  }
}

【讨论】:

    猜你喜欢
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多