【问题标题】:Better / Faster way to modify all matched property found under different depth from a nesting object更好/更快的方法来修改在嵌套对象的不同深度下找到的所有匹配属性
【发布时间】:2019-03-04 10:47:18
【问题描述】:

我从需要解析和修改一个属性值的 API 收到一个 json。问题是,我收到的 json 数据的嵌套结构不一致,我无法控制它。

这将禁止我指定在特定深度下查看,例如 parsedJson.children[0].property,因为我正在寻找的属性可以在不同的嵌套级别上找到,例如 parsedJson.children[0].children[ 0].property 在下一次迭代中。

我目前就是这样做的,效果很好

var parsedJson = JSON.parse('{"a":[{"a1":[{"p":0},{"np":1}]}],"b":[{"p":0},{"np":1}],"c":[{"c1":[{"c2":[{"p":0}]},{"np":1}]}]}')


console.log("before modify")
console.log(parsedJson)

modifyProperty(parsedJson,"p",1);


function modifyProperty(obj,prop,val){
    for (var key in obj){
            if (key == prop){
            obj[key] = val;
        }
        modifyProperty(obj[key],prop,val);
    }
}

console.log("after modify")
console.log(parsedJson)

但我担心以后,如果我从 API 收到一个包含更多数据和更深嵌套级别的 json,它可能会影响性能,因为这需要递归地逐个检查所有子节点。

有没有更好/更快的方法?

【问题讨论】:

  • 那么,我相信您的担忧是围绕 for 循环?而且,不是 JSON 解析……对吗?

标签: javascript json


【解决方案1】:

您可以将第二个参数传递给JSON.parse,以递归方式转换所有所需的属性值:

var parsedJson = JSON.parse(
  '{"a":[{"a1":[{"p":0},{"np":1}]}],"b":[{"p":0},{"np":1}],"c":[{"c1":[{"c2":[{"p":0}]},{"np":1}]}]}',
  (key, val) => key === 'p' ? 1 : val
);
console.log(parsedJson);

【讨论】:

  • 太好了,我不知道 reviver 参数。
猜你喜欢
  • 2019-08-15
  • 1970-01-01
  • 1970-01-01
  • 2019-11-05
  • 2019-02-03
  • 2019-03-15
  • 2021-07-27
  • 2018-06-04
  • 2020-08-31
相关资源
最近更新 更多