Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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_Arrays_Json_Object_Push - Fatal编程技术网

Javascript中对象创建的异常行为

Javascript中对象创建的异常行为,javascript,arrays,json,object,push,Javascript,Arrays,Json,Object,Push,我无法通过此代码获得预期值,请帮助我识别此代码中的错误。我是java脚本的新手,我怀疑问题可能是由于对象创建或对象范围造成的。我用几种方法调试了它,但无法确定问题所在 另外,请告诉我我正在创建的数据是否为JSON格式。如果不是,那么等效的JSON格式是什么 PS.id = -1; PS.data = { formData:[] }; PS.setDef = []; PS.item = {}; if(cond){ PS.item.Name = "From"; PS.item.Type

我无法通过此代码获得预期值,请帮助我识别此代码中的错误。我是java脚本的新手,我怀疑问题可能是由于对象创建或对象范围造成的。我用几种方法调试了它,但无法确定问题所在

另外,请告诉我我正在创建的数据是否为JSON格式。如果不是,那么等效的JSON格式是什么

PS.id = -1;

PS.data = {
 formData:[]
};

PS.setDef = [];

PS.item = {};

if(cond){

PS.item.Name = "From";
PS.item.Type = "STRING";

PS.setDef.push(PS.item);
alert(PS.setDef[0].Name);

PS.item.Name = "To";
PS.item.Type = "STRING";

PS.setDef.push(PS.item);
alert(PS.setDef[1].Name);

}//here alerts are coming properly. getting 'from' and 'to' in alerts

PS.data.formData.push({"id":id++, "setDef":[PS.setDef[0]]});
PS.data.formData.push({"id":id++, "setDef":[PS.setDef[1]]});

//expected id 0 
alert(PS.data.formData[0].id);
//expected name 'from'
alert(PS.data.formData[1].setDef[0].Name);

//expected id 1
alert(PS.data.formData[1].id);
//expected name 'to'
alert(PS.data.formData[1].setDef[1].Name);
我得到的不是0和1作为ID,名称作为“from”和“to”,而是以下值

-1
0
to
to
更新1:此处PS表示已声明的页面范围,已编辑警报以打印变量。

此处有两件事。 首先,对于id,将代码更改为:

PS.data.formData.push({"id":++PS.id, "setDef":[PS.setDef[0]]});
PS.data.formData.push({"id":++PS.id, "setDef":[PS.setDef[1]]});
由于在将id++分配给id时,id以-1开头,它首先分配id中当前的值,然后增加id的值,因此得到-1和0

其次,当您推PS.item时,实际上是将引用传递给对象,而不是实际对象。因此,当您更新PS.item的值时,它会反映在两个位置。尝试创建一个新对象并推送它,而不是覆盖旧对象


使用
PS.item={}在指定值之前创建新对象。这应该行得通。

您在代码的这一部分中只引用了PS.item两次:

PS.item.Name = "From";
PS.item.Type = "STRING";

PS.setDef.push(PS.item);
alert(PS.setDef[0].Name);

//changing the value of PS.item 
PS.item.Name = "To";
PS.item.Type = "STRING";

PS.setDef.push(PS.item);
alert(PS.setDef[1].Name); 
您可以这样更改代码,并对结果感到满意:

//creating first instance
PS.item = {};

PS.item.Name = "From";
PS.item.Type = "STRING";

PS.setDef.push(PS.item);
alert(PS.setDef[0].Name);

//creating the second instance
PS.item = {};

PS.item.Name = "To";
PS.item.Type = "STRING";

PS.setDef.push(PS.item);
alert(PS.setDef[1].Name);

明白了吗?

您的代码有几个逻辑错误和一个打字错误。这是已更正的版本(更改已在注释中标记为
**此处**


您的
PS
声明在哪里?您正在
alert
ing
strings
而不是变量的值。执行
PS.data.formData.push({“id”:id++,“setDef”:[PS.setDef[0]})时也是如此id变量以前没有定义过。感谢您的回答,请您发布代码以创建新对象。我知道对象创建的构造函数方式,但在这里,由于我必须使用PS范围,我感到震惊。提前谢谢。谢谢@Sinax,问题解决了。你能澄清我关于json格式问题的第二部分吗?很抱歉,我在你的代码片段中找不到json部分。您正在创建和填充一些对象和数组,稍后可以在一次调用中使用JSON.stringify方法将它们转换为JSON格式,这样您就没有任何循环引用了。谢谢您的时间。理解我的错误,问题解决了。你能解释一下我问题的第二部分,关于JSON格式吗?要求将此数据转换为JSON格式,并使用DWR发送到后端,并使用Java在后端处理此数据。我对方法参数的语法感到困惑。例如像getJsonData(Map)一样,getJsonData(Map[])在java中表示上述数据格式的语法是否正确?@user3131769:对不起,我不知道java泛型(在他们尝试引入java之前,我放弃了java)。我想说的是,没有一种静态类型不是基于泛型“值”类型(可以是null、字符串、数字、数组或对象,其中数组和对象包含泛型值)的,但是能够表示泛型JSON消息的解析。
PS.id = -1;

PS.data = {
    formData:[]
};

PS.setDef = [];

if(cond){
    // *** HERE ***
    // Your code was creating just one object instance in
    // PS.item, pushing it, mutating and pushing it again
    // The "alert" call was apparently correct just because
    // it was done before mutating the object. Just moving
    // both alerts at the end would have shown the problem.

    PS.setDef.push({Name: "From", Type: "STRING"});
    alert(PS.setDef[0].Name);

    PS.setDef.push({Name: "To", Type: "STRING"});
    alert(PS.setDef[1].Name);

}

// **HERE**
// id++ increments a value but returns the value BEFORE the increment.
// Thus formData[0] is expected to have .id == -1, not 0.
// If you want the value AFTER the increment then use ++id.
PS.data.formData.push({"id":++id, "setDef":[PS.setDef[0]]});
PS.data.formData.push({"id":++id, "setDef":[PS.setDef[1]]});

//expected id 0 
alert(PS.data.formData[0].id);
//expected name 'from'
// *** HERE ***
// In the original code there is a typo (formData[1] instead of formData[0])
alert(PS.data.formData[0].setDef[0].Name);

//expected id 1
alert(PS.data.formData[1].id);
//expected name 'to'
alert(PS.data.formData[1].setDef[1].Name);