Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript对象文字符号-创建混合(排序)_Javascript_Json - Fatal编程技术网

Javascript对象文字符号-创建混合(排序)

Javascript对象文字符号-创建混合(排序),javascript,json,Javascript,Json,因为没有更好的标题。。。可以在JSON中执行类似的操作吗 var obj = { a : 'a constant', b : a + ' and b constant' } 更新:不起作用-此。a返回未定义的我知道这会起作用,但它看起来相当丑陋和复杂: var obj = { a : 'a constant', b : (function(){ return this.a + ' and b con

因为没有更好的标题。。。可以在JSON中执行类似的操作吗

var obj = {
            a : 'a constant',
            b : a + ' and b constant'
}
更新:不起作用-此。a返回
未定义的
我知道这会起作用,但它看起来相当丑陋和复杂:

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'派生),而不是在一个地方执行search-n-replace

你是说用javascript吗

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

JSON是一种数据格式。它没有函数的概念,就像任何其他数据格式(HTML、XML、纯文本)一样

这似乎只用于数据压缩。您为什么不使用许多标准实现中的一种来压缩数据呢

如果您希望您的数据有大量的冗余,而这些冗余是普通压缩方案无法有效压缩的,那么您可以像这里所说的那样做,例如

var obj = {
            a : 'a constant',
            b : '[fld=a] and b constant'
}
你的代码在任何一端都必须实现和解析它。也就是说,它将在每个成员中搜索
[fld=x]
,并用成员
x
的值替换。但它仍然只是一种定制的数据压缩方案。它与JSON无关

编辑

Javascript对象
JSON
是完全不同的(尽管是相关的)东西。Javascript对象是Javascript中的任何实体。JSON是一种数据格式,旨在以基于文本的表示法表示编程对象,特别是为了通过线路与其他编程实体交换(或者当内部格式不可移植时)

如果您只是询问Javascript对象是否可以包含引用其另一个成员的函数,那么当然,您已经回答了自己的问题

不过,您不需要一个自动执行的函数,它只会创建工作,而且最终也不会反映将来对a所做的任何更改。只需执行常规功能:

b:function(){返回这个.a+'和b常量';}

或者更可能的情况是,只需创建一个“方法”,而不使用字段:

var obj = {
            a : 'a constant',
            b : 'b constant',
            ab: function() { return a+b }
}

据我所知,简短的答案是否定的,尽管有很多方法可以通过更复杂的代码来实现这一点。最明显的是将
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';
好的,一种方法。我不知道这是否适用于您,因为它不会递归,但是请尝试一下。这就利用函数来操作数据

请注意,原始字符串是您请求的有效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
});
var json='{“a”:“a常量”,“b”:“[get:a]和b常量”,“c”:“test”}”;
var jsonobj=JSON.parse(JSON,函数(键,值){
//确保该值具有匹配函数,即,它是一个字符串
if(value.match){
//检查[获取:xxx]
var matches=value.match(/\[get:([^\]]*\])/g);
//如果发现了什么
如果(匹配){
//循环每一场比赛。

对于(i=0;i发现了一个潜在的解决方案:

var obj = {
            a : 'a constant',
            b : obj.a + ' and b constant'
};

谢谢大家的提示!向上投票所有好的建议。

检查您的JavaScript语法,这是无效的。也许您的意思是
a:…
不是
a=…
除了语法之外,在第二个示例中,“this”不是指向封闭的对象,而是指向调用自调用函数的上下文。@Jim:更正了语法@Matt,忘了第二个例子吧。反正我也不想用它。有什么方法可以实现第一个吗?顺便说一句,这不是JSON,这是Javascript对象文字符号。JSON是一种数据格式,所以它没有任何变量或函数的概念-请参阅@nrabinowitz:Point。我使用JSON,因为它更容易接受和吸引人。所以rry about that.Nope.我指的是JSON。但我在javascript代码中定义并使用这个JSON对象,我并不是说在任何ajax调用中都要传递这个对象。@Mrchief我想你可能把javascript对象语法和JSON混淆了(名称有点误导性).JSON是一种定义的编码,恰好是javascript语法的一个子集。它不应该是obj[“b”]=obj[“a”]+“和b常量”?您也这么做了。需要obj.b=obj.a,等等……)