1

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);

しかし、マップデータは変更されていません..参照を使用してループし、値を変更する方法..?

4

2 に答える 2

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);
于 2013-01-16T12:02:00.207 に答える
-2

これを試してください。必要に応じてパス変数を変更してください。正常に動作しています。ファイアバグで確認しました。

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から出力する場合は、条件を削除します。

于 2013-01-16T12:12:17.830 に答える