【问题标题】:Updating nested objects dynamically in javascript [duplicate]在javascript中动态更新嵌套对象[重复]
【发布时间】:2015-02-26 18:23:40
【问题描述】:

我有一个从 json 解码的对象:

var data = [{
    "parentSeries":1,
    "children":[{
        "BusinessRule":"ChrisTest2",
        "ID":"ChrisTest2||3",
        "childsub":3,
        "jsonCondition":{
            "parentSeries":1,
             "children":[{
                 "RuleDefinition":"ChrisTest2||3",
                 "ID":"ChrisTest2||3||CondField1",
                 "Field":"CondField1",
                 "Test":"=1"
             },{
                 "RuleDefinition":"ChrisTest2||3",
                "ID":"ChrisTest2||3||CondField2",
                "Field":"CondField2",
                "Test":"=2"
             }]
        }
    }]
}]

我想动态更新这个对象的任何元素。我有一个数组,显示我要更新的属性在哪里。例如:

var splitMap = ["jsonCondition", "children", "0", "Test"]

我有一个值,我想用传入的 (newValue) 来更新这个数组中的最后一个条目,并且我有一些代码来更新特定的嵌套项以包含这个新值:

if (splitMap.length > 0) {
    var newdata = data;
    for (var p = 0; p < splitMap.length-1; p++) {
        newdata = newdata[splitMap[p]];
    }
    newdata[splitMap[splitMap.length - 1]] = newValue;
}

但我想不出办法将其更新为原始数据!我基本上是想做的

oldobject['jsonCondition']['children'][0] = newdata

oldobject['jsonCondition']['children'][0]['Test'] = newValue

...但我希望它根据地图数组的内容和长度计算出这条路径的键和深度。如果有帮助,我在我们的平台上有 jquery($.each?)!有任何想法吗?谢谢:)

【问题讨论】:

  • 你有没有想过编写一个使用 $.each 并检查下一层是否是对象的递归函数?
  • splitMap 数组从何而来?从那里开始,您可能能够存储一个对象引用,这将使其变得更加容易
  • 谢谢大家,我可以在重复的问题上使用@Labithiotis 答案:)

标签: javascript jquery arrays json object


【解决方案1】:

您应该能够通过使用括号符号[] 依次访问每个属性来沿着对象向下走:

var curr = oldobject;   // this keeps track of our current position
for (var i=0; i < splitMap.length-1; i++) {
    if (curr.hasOwnProperty(splitMap[i]) {
        curr = curr[splitMap[i]];
    }
    else {
       // your map is wrong! Up to you how to handle this error
    }
}
curr[splitMap[i]] = newValue;    // for the last property, we set the value

【讨论】:

  • 谢谢!这几乎就是我要去的地方(虽然你的循环更好,谢谢!)。我的问题是这会更新最低的嵌套对象,但我无法弄清楚如何将它与右侧的父“oldobject”对象合并上下文,并通过 splitMap 数组而不是硬编码对象引用(因为 splitMap 数组可以是任何东西,任何深度)。即,我想做 oldobject['jsonCondition']['children'][0] = curr,但我希望它是程序化的。
  • @chrisb:不确定你的意思。您正在更新 原始对象 的最低级别的属性。没有必要合并任何东西。这就是为什么如果你的splitMap 只循环到倒数第二个属性。因为我们想分配给最后一个。
猜你喜欢
  • 2021-11-15
  • 2023-01-22
  • 2021-11-17
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 2020-05-22
相关资源
最近更新 更多