有没有一种方法可以通过指定一个属性来自动创建javascript对象?

有没有一种方法可以通过指定一个属性来自动创建javascript对象?,javascript,perl,Javascript,Perl,我正在做一个需要通过JSON将Perl对象传递给javascript的项目。我在“中间”对象定义方面面临一个问题 在Perl中,对象由散列表示,程序员不必“中间”定义任何内容。创建属性后,所有中间对象将自动创建为哈希引用。e、 g $graph{chart}{yAxis}{title} = "Temperature Tracking"; 但是,一旦将此对象传递给Javascript,如果我想在“中间”对象中添加任何新属性,例如: graph.chart.xAxis.title = "Time

我正在做一个需要通过JSON将Perl对象传递给javascript的项目。我在“中间”对象定义方面面临一个问题

在Perl中,对象由散列表示,程序员不必“中间”定义任何内容。创建属性后,所有中间对象将自动创建为哈希引用。e、 g

$graph{chart}{yAxis}{title} = "Temperature Tracking";
但是,一旦将此对象传递给Javascript,如果我想在“中间”对象中添加任何新属性,例如:

graph.chart.xAxis.title = "Time Sequence";
我将有一个“未定义的graph.chart.xAxis”错误。与Perl不同,如果我们只为Javascript分配属性,它不会自动创建对象

目前,我必须使用以下解决方案:

if (!graph.chart.xAxis) {
  graph.chart.xAxis = {};
  graph.chart.xAxis.title = "Time Sequence";
}

不幸的是,在我们的项目中,从Perl传递的对象是非常动态的,还有很多Javascript可能不知道的其他对象。上述方式使得JS代码相当冗长且“难看”。有没有更好的解决方案让Javascript表现得像Perl,这意味着我不必手动创建中间对象?

我不确定这是否满足您的要求,但创建缺少的对象的简单函数可能如下所示:

函数插入节点(对象、节点、值){
var segments=node.split('.');
var key=segments.pop();
var ref=obj;
而(分段长度>0){
var segment=segments.shift();
if(类型参考[段]!=“对象”){
ref[段]={};
}
ref=ref[段];
}
ref[键]=值;
};
var x={};
insertNode(x,'foo.bar.baz','helloworld');
警报(x.foo.bar.baz);//“你好,世界”

演示:

您可能对名为


不确定是否适合您的情况,但您可以检查是否存在属性,如果不存在,则创建属性,如:

function use_or_create(obj, prop) {
   return (obj.hasOwnProperty(prop))  ? true : (obj[prop] = {});
}
var graph.chart = {}; //your object
//function call to check if property exist before trying to use it
use_or_create(graph.chart, 'xAxis'); //check if xAxis exists and creates one if doesnot
graph.char.xAxis.title = "tested";

也许这个
对象
扩展可以:

Object.prototype.val = function(prop,val){
  prop = /\./i.test(prop) ? prop.split('.') : prop;
  if (prop.constructor === Array){
      var objnow = this, pr;
      while (pr = prop.shift()){
        if (!objnow[pr]){
            objnow[pr] = {};
        }
        if (!prop.length) {
            objnow[pr] = val;
        }
        objnow = objnow[pr];
      }
      for (var l in objnow){
          this[l] = objnow[l];
      }
  } else {
      this[prop] = val;
  }
}
// usage
var myO = {};
myO.val('a.b.c',3);        //=> myO.a.b.c = 3
myO.val('someprop',3);     //=> myO.someprop = 3
myO.val('a.b.someprop',5); //=> myO.a.b.someprop = 3

嗯,你可以简单地编写一个小函数来创建所有缺少的对象。@Niko我不确定,但是javascript没有自动激活功能,对吗?您认为该函数如何检查丢失的对象?@Ioldop请参见下面的答案。不过,你必须使用字符串来完成。非常感谢,Sudhir。这个解决方案比我原来的解决方案好很多,但是我仍然需要测试中间的每个嵌套对象的存在。太好了!这似乎是最简单的解决方案。非常感谢!妮可。我做了一些测试,你的解决方案很好。现在我明白Javascript中似乎没有内置的功能来处理这个问题。
Object.prototype.val = function(prop,val){
  prop = /\./i.test(prop) ? prop.split('.') : prop;
  if (prop.constructor === Array){
      var objnow = this, pr;
      while (pr = prop.shift()){
        if (!objnow[pr]){
            objnow[pr] = {};
        }
        if (!prop.length) {
            objnow[pr] = val;
        }
        objnow = objnow[pr];
      }
      for (var l in objnow){
          this[l] = objnow[l];
      }
  } else {
      this[prop] = val;
  }
}
// usage
var myO = {};
myO.val('a.b.c',3);        //=> myO.a.b.c = 3
myO.val('someprop',3);     //=> myO.someprop = 3
myO.val('a.b.someprop',5); //=> myO.a.b.someprop = 3