Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.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 JSON字符串化数组的值_Javascript_Json - Fatal编程技术网

Javascript JSON字符串化数组的值

Javascript JSON字符串化数组的值,javascript,json,Javascript,Json,我正在尝试字符串化一个对象,但不知道为什么它不能按预期工作: function request(url) { this.url = url; this.head = []; } var r = new request("http://test.com"); r.head["cookie"] = "version=1; skin=new"; r.head["agent"] = "Browser 1.0"; document.write(JSON.stringify(r)); 我希望这个

我正在尝试字符串化一个对象,但不知道为什么它不能按预期工作:

function request(url) {
  this.url = url;
  this.head = [];
}

var r = new request("http://test.com");
r.head["cookie"] = "version=1; skin=new";
r.head["agent"] = "Browser 1.0";
document.write(JSON.stringify(r));
我希望这个对象可以字符串化为:

{"url":"http://test.com","head":["cookie":"version=1; skin=new", "agent":"Browser 1.0"]}
但我只得到:

{"url":"http://test.com","head":[]}

如何修复它?

我认为,您希望r的hear属性是一个关联数组(类似于PHP)。它们不存在于JavaScript中。数组的值由数字索引

由于r.head是一个对象(array在JS中是object),您可以使用
r.head[“which property name”]=“value”
向其添加属性,但在使用JSON.stringify时,这些属性似乎不会序列化为JSON,因为
r.head
被定义为一个数组,并且它只会序列化编号的索引值

要解决这个问题,您可以将
r.head
定义为一个对象,以便JSON.stringify将序列化所有属性

function request(url) {
  this.url = url;
  this.head = {};
}

var r = new request("http://test.com");
r.head["cookie"] = "version=1; skin=new";
r.head["agent"] = "Browser 1.0";
document.write(JSON.stringify(r));
如果在cosole中运行以下代码(在浏览器中按F12键),您将看到数组的序列化方式与对象的序列化方式不同:

var b = [];
b.something=22
console.log(b.something);
console.log(JSON.stringify(b));//=[]
console.log(b.hasOwnProperty("something"))//=true


b = {};
b.something=22
console.log(b.something);
console.log(JSON.stringify(b));//={"something":22}
console.log(b.hasOwnProperty("something"))//=true

以您希望的方式序列化它是不可能的

有了这个目标:

function request(url) {
  this.url = url;
  this.head = []; 
}
这种变化:

var r = new request("http://test.com");
r.head.push({"cookie": "version=1; skin=new"});
r.head.push({"agent": "Browser 1.0"});

document.write(JSON.stringify(r));
将给你:

{"url":"http://test.com","head":[{"cookie":"version=1; skin=new"},{"agent":"Browser 1.0"}]}
{"url":"http://test.com","head":{"cookie":"version=1; skin=new","agent":"Browser 1.0"}}
如果要将对象更改为:

function request(url) {
  this.url = url;
  this.head = {}; 
}

var r = new request("http://test.com");
r.head["cookie"] = "version=1; skin=new";
r.head["agent"] = "Browser 1.0";

document.write(JSON.stringify(r));
将给你:

{"url":"http://test.com","head":[{"cookie":"version=1; skin=new"},{"agent":"Browser 1.0"}]}
{"url":"http://test.com","head":{"cookie":"version=1; skin=new","agent":"Browser 1.0"}}
第一个变量保证在迭代时按顺序为您提供头值。它还有一个优点,就是如果您感兴趣的话,可以在以后按特定顺序插入内容

按照惯例,第二个版本将按照插入的顺序返回项目,只要没有基于数字的键,但ecma规范不保证该顺序。

可能重复