如何转换javascript字符串以引用对象属性?

时间:2015-02-23 14:43:53

标签: javascript string object properties eval

我有一个带有一堆数组属性的自定义对象。

function Location (name, displayName){
  this.name = name,
  this.displayName = displayName,
  Location.objects.push(this);                           
}
Location.objects = [];

//Initialize Farm
var farm = new Location();

farm.scenes = [
  "content 0",
  "content 1",
  "Content 2"
];

使用JQuery,我从DOM中获取一个属性,我需要用它来调用对象中的值。

$('button').click(function(){
      var location = $(this).attr('id'); //in this case, the id is 'farm'
      mainLoop(location);
});

function mainLoop(location){
  console.log(farm.scenes.length);// returns '3' as desired    
  console.log(location.scenes.length);//returns undefined because location is a string. I need this to work.
  console.log(location[scenes][length]); //same problem
}

我到目前为止找到的唯一解决方案是使用eval(),但我不能这样做,因为这些数据可能会被最终用户操纵。

function mainLoop(location){
  location = eval(location); 
  console.log(location.scenes.length);//returns 3 as desired
}

我需要一种替代方法来以某种方式获取此字符串并将其转换为对象属性引用。在这种情况下,我正在使用有限数量的结果,所以我可能会将一组字符串映射到标识符,但我觉得这可能是一个更优雅的解决方案,虽然我无法弄清楚我应该提出什么问题输入stackoverflow。

有一个类似的问题Dynamically access object property using variable,但这不适用于此 - 使用两种表示形式的以下两行都将解析为'3'。我认为我的语法在表示法上是正确的,所以我必须做错其他的事情。

console.log(location.scenes.length);    //returns undefined because location is a string. I need this to work.
console.log(location[scenes][length]);  //same problem

1 个答案:

答案 0 :(得分:0)

由于使用location = eval(location);将其转换为您想要的对象,我假设传递给location函数的mainLoop只是表示对象的JSON字符串,相当于{ {1}}

您可以使用JSON.parse - 在这种情况下:

'{"scenes" : ["content 0", "content 1", "Content 2"]}'

如今,它在浏览器中几乎是标准的。在this related SO question中有关于JSON.parse的更多信息,它指出如果你已经在使用jquery(它看起来像你),那么你可以使用console.log(location); // outputs '{"scenes" : ["content 0", "content 1", "Content 2"]}' location = JSON.parse(location); console.log(location.scenes.length); // outputs 3 来处理旧浏览器回到$.parseJSON