我正在做一个需要通过JSON将Perl对象传递给javascript的项目。我在“中间”对象定义方面遇到了问题。
在Perl中,object由hash表示,程序员不必在“中间”定义任何东西。创建属性后,所有中间对象都将自动创建为哈希引用。 e.g。
$graph{chart}{yAxis}{title} = "Temperature Tracking";
但是,一旦将此对象传递给Javascript,如果我想在“中间”对象中添加任何新属性,例如:
graph.chart.xAxis.title = "Time Sequence";
我将遇到“undefined graph.chart.xAxis”错误。与Perl不同,如果我们只是为它分配一个属性,Javascript就不会自动创建对象。
目前我必须使用以下解决方案:
if (!graph.chart.xAxis) {
graph.chart.xAxis = {};
graph.chart.xAxis.title = "Time Sequence";
}
不幸的是,在我们的项目中,从Perl传递的对象非常动态,并且还有许多Javascript可能不知道的其他对象。上面的方法使JS代码相当冗长和“丑陋的外观”。有没有更好的解决方案让Javascript像Perl一样,这意味着我不必手动创建中间对象?
答案 0 :(得分:3)
我不确定这是否符合您的要求,但创建缺失对象的简单功能可能如下所示:
function insertNode(obj, node, value) {
var segments = node.split('.');
var key = segments.pop();
var ref = obj;
while (segments.length > 0) {
var segment = segments.shift();
if (typeof ref[segment] != 'object') {
ref[segment] = {};
}
ref = ref[segment];
}
ref[key] = value;
};
var x = {};
insertNode(x, 'foo.bar.baz', 'hello world');
alert(x.foo.bar.baz); // "hello world"
答案 1 :(得分:2)
您可能对名为steeltoe
的图书馆感兴趣steelToe(graph).set('chart.xAxis.title', 'Time Sequence');
答案 2 :(得分:2)
不确定,如果它适用于您的情况,但您可以检查属性是否存在并创建它(如果不存在),例如:
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";
答案 3 :(得分:2)
也许这个Object
扩展程序可以:
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