在javascript中动态更新嵌套对象
我有一个从json解码的对象:在javascript中动态更新嵌套对象,javascript,jquery,arrays,json,object,Javascript,Jquery,Arrays,Json,Object,我有一个从json解码的对象: var data = [{ "parentSeries":1, "children":[{ "BusinessRule":"ChrisTest2", "ID":"ChrisTest2||3", "childsub":3, "jsonCondition":{ "parentSeries":1, "children":[{
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"]
我有一个值,我想用coming in(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;
}
或
…但我希望它根据地图数组的内容和长度计算出该路径的关键点和深度。我在我们的平台上有jquery,如果有帮助的话($。每个?)!有什么想法吗?谢谢:)您应该能够通过使用括号符号
[]
依次访问每个属性,沿着对象走下去:
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
var curr=oldobject;//这将跟踪我们当前的位置
对于(变量i=0;i
您是否考虑过编写一个使用$的递归函数,并检查下一级是否为对象?从那里开始,您可能可以存储一个对象引用,使其更加容易。谢谢,我能够使用@Labithiotis回答重复的问题:)谢谢这正是我要做的(尽管你的循环更好,谢谢!)。我的问题是,这会更新最低嵌套对象,但我不知道如何在正确的上下文中通过splitMap数组将其与父对象“oldobject”合并,而不是硬编码对象引用(因为splitMap数组可以是任何内容,也可以是任何深度)。也就是说,我想执行oldobject['jsonCondition']['children'][0]=curr,但我希望它是可编程的。@chrisb:不确定你的意思。你正在更新原始对象的最低级别的属性。不需要合并任何内容。这就是为什么如果你的splitMap
,我们只循环到倒数第二个属性。因为我们希望分配到最后一个属性。
oldobject['jsonCondition']['children'][0]['Test'] = newValue
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