【问题标题】:How to traverse through JSON data dynamically and make changes ..?如何动态遍历 JSON 数据并进行更改..?
【发布时间】:2013-01-16 11:58:15
【问题描述】:

我有一个类似 JSON 数据的地图

var map =  {        
    level1 : {          
            x : {name:'level1 x' , },
            y : {name:'level1 y'}
    },
    level2 : {          
            x : {name:'level2 x'},
            y : {name:'level2 y'}
    }

}

我需要遍历这些数据,我将遍历路径作为字符串获取

"level1 x name" , "level2 y name";

如何解析来自该字符串路径的 JSON 数据..??

我尝试的是,

var path = "level1 x name".split(" ");
var pointer = map; // assuming it will take reference of map and change will cause to map also
 for (var i = 0, len = path.length; i < len; i++) {
   if(pointer){
      pointer = pointer[path[i]];
   }else{
     pointer = map[path[i]];
   } 
 }
 pointer = "level1 xx";

console.log(map);

但是地图数据并没有改变..如何循环引用并更改值..?

【问题讨论】:

  • 它只是一个 js 对象字面量..

标签: javascript arrays json parsing object


【解决方案1】:

这就是你获得价值的方式:

var name = [map].concat("level1 x name".split(" ")).reduce(function(prev, curr) {
    return prev[curr];
});

console.log(name);

// -> 'level1 x'

JavaScript 通过值而不是引用传递参数。

为了您的方便,我更改了您的代码,以便满足您的要求:

var path = "level1 x name".split(" ");
var pointer = map; // assuming it will take reference of map and change will cause to map also
 for (var i = 0, len = path.length-1; i < len; i++) {
   if(pointer){
      pointer = pointer[path[i]];
   }else{
     pointer = map[path[i]];
   } 
 }
 pointer[path[path.length-1]] = "level1 xx";

console.log(map);

【讨论】:

  • ys.. 我能够用我发布的代码读取这个值.. 我需要像 map['level1']['x']['name'] 这样的参考跨度>
  • 其传递的 bt 引用仅 rt..?
  • @SarathSaleem:JavaScript 中没有引用。 pointer 是对象map 层次结构中的倒数第二个级别。
【解决方案2】:

试试这个.. 根据需要更改路径变量。它工作正常。我刚刚在firebug中验证了它。

var map =  {        
    level1 : {          
            x : {name:'level1 x' , },
            y : {name:'level1 y'}
    },
    level2 : {          
            x : {name:'level2 x'},
            y : {name:'level2 y'}
    }
};
var path = "level1 x name";
var pathInfor = path.split(' ');
var pathLength = pathInfor.length;
//alert(map[pathInfor[0]][pathInfor[1]][pathInfor[2]].name);

for(level in map)
{
    if(level == pathInfor[0]){
       var selLevel = map[level];
        for(xy in selLevel)
        {
           if(xy == pathInfor[1])
           {
                  var selVariable = map[level][xy];
                    for(innerVal in selVariable){
                               if(innerVal == pathInfor[2]){
                               alert(map[level][xy][innerVal]);
                               }
                    }
           }
        }
    }
}

在这种方法中,您不需要检查值。如果要打印 JSON 格式的所有值,请删除条件。

【讨论】:

  • 当然..它是硬编码版本..可能字符串和地图数据会改变..我需要一个通用的。
  • 嵌套层级呢?会有所不同吗?
猜你喜欢
  • 2017-02-16
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 2016-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多