缺少更好的标题......是否有可能在JSON中做这样的事情?
var obj = {
a : 'a constant',
b : a + ' and b constant'
}
更新不起作用 - this.a返回undefined
我知道这会有效,但看起来相当丑陋和错综复杂:
var obj = {
a : 'a constant',
b : (function(){ return this.a + ' and b constant'; })()
}
击> <击> 撞击> 这就是我目前所拥有的:
var obj = {
a : 'a constant',
b : 'a constant and b constant'
}
我知道有些人评论过的其他方式,我真诚地感谢他们的回应。但是,它们看起来并不简单或优雅。我对当前实现的唯一问题是,如果'a'的值得到更新,search-n-replace必须在很多地方完成(我说很多,因为有更多的属性来自'a')而不是之一。
答案 0 :(得分:1)
在JSON中,没有。 http://json.org/
你的意思是javascript吗?
答案 1 :(得分:1)
JSON是一种数据格式。它没有任何功能概念,就像任何其他数据格式(HTML,XML,纯文本)一样。
这似乎服务的唯一目的是数据压缩。为什么不使用众多标准实现之一来压缩数据呢?
如果您希望您的数据具有大量冗余,而这种冗余无法通过正常的压缩方案进行有效压缩,那么您可以执行类似于此处所述的操作,例如:
var obj = {
a : 'a constant',
b : '[fld=a] and b constant'
}
并且你们两端的代码都必须实现并解析它。也就是说,它将在每个成员中搜索[fld=x]
并用成员x
的值替换。但它仍然只是一种自定义数据压缩方案。它与JSON无关。
修改的
Javascript Objects
和JSON
完全不同(虽然相关)。 Javascript对象是Javascript中的任何实体。 JSON是一种数据格式,用于表示基于文本的表示法中的编程对象,特别是为了通过线路与其他程序实体交换(或者当内部格式不可移植时)。
如果您只是询问Javascript对象是否可以包含引用其中一个成员的函数,那么您已经回答了自己的问题!
您不需要自动执行功能,只需创建工作,并且最终也不会反映将来对A所做的任何更改。只需做一个常规功能:
b : function() { return this.a + ' and b constant'; };
或者更有可能的是,只需创建一个“方法”并让你的字段保持不变:
var obj = {
a : 'a constant',
b : 'b constant',
ab: function() { return a+b }
}
答案 2 :(得分:1)
好的,here's这样做的方法。我不知道这是否适合你,因为它没有递归,但试试看。这使用reviver函数来操作数据。
请注意,原始字符串是您请求的有效JSON字符串。正如其他人提到的那样,你的例子不是有效的JSON。
示例强>
var json = '{"a":"a constant","b":"[get:a] and b constant","c":"test"}';
var jsonobj = JSON.parse(json, function(key, value) {
//Ensure that value has the match function, ie. it's a string
if (value.match) {
//check for [get:xxx]
var matches = value.match(/\[get:([^\]]*\])/g);
//if something was found
if (matches) {
//Loop through each match.
for (i=0; i<matches.length; i++) {
//check if this object has that property
if (this[matches[i].substring(5, matches[i].length-1)]) {
//If it does, replace the matched text with
// the property's value.
// Note: It's split onto two lines for clarity on SO
value = value.replace(matches[i],
this[matches[i].substring(5, matches[i].length-1)]);
}
}
}
}
return value; //Return the possibly modified value
});
修改强>
另外,我在Opera 11,IE8和FF 3.6上进行了测试。
答案 3 :(得分:0)
var obj = {};
obj["a"] = "a constant";
obj["b"] = obj["a"] + " and b constant";
它不漂亮,它不是JSON,但我认为这是你唯一的希望。
否则,请以不同方式标记JSON以适合您的用例:
var obj = {
a: "a constant",
b: "and b constant",
prependAB: true
}
...
if(obj.prependAB){
alert(obj.a + obj.b);
}
else{
alert(obj.b);
}
答案 4 :(得分:0)
据我所知,简短的回答是否定的,尽管有很多方法可以通过更多参与代码来实现。显而易见的是将a
放入变量:
a = 'a constant';
var obj = {
a : a,
b : a + ' and b constant'
}
需要调用基于函数的方法,而不是在定义对象时进行评估:
var obj = {
a : 'a constant',
b : function(){ return this.a + ' and b constant'; }
}
obj.b();
另一种方法,也可能是明显的说法,是两遍版本:
var obj = {
a : 'a constant'
}
obj.b = obj.a + ' and b constant';
答案 5 :(得分:0)
找到了一个潜在的解决方案:
var obj = {
a : 'a constant',
b : obj.a + ' and b constant'
};
感谢大家的提示!提出所有好的建议。