如何在JavaScript中像对象一样序列化数组?

问题描述 投票:-1回答:3

如果我创建一个这样的关联数组:

var a = []; 
a.push("hello");
a["hello"] = "world";
JSON.stringify(a);

并将其序列化为JSON,结果是

“[“你好”]”

如果我创建它就像

var a = {};
a["hello"] = "world";
JSON.stringify(a);

结果是

“{“你好,世界”}”

在JavaScript中是否有一种方法可以像对象变量一样序列化数组变体? 我的意思是没有将所有属性复制到对象中,也没有编写自己的JSON字符串?

javascript arrays json javascript-objects associative-array
3个回答
2
投票

如果您只是想以stringify那些以编程方式推送(a.push("hello");)或指定(如a["hello"] = "world";)的属性,那么您可以使用Object.assign

JSON.stringify( Object.assign ( {}, a ) );

演示

var a = []; 
a.push("hello");
a["hello"] = "world";
console.log(JSON.stringify( Object.assign ( {}, a ) ));

2
投票

您可以拆分数组部件和没有数组部件的部件,并在将整个对象串联在一起以重新组装具有自定义属性的新数组。

var a = []; 

a.push("hello");
a["hello"] = "world";

var o = Object.assign(...Object.keys(a).map(k => (+k).toString() !== k ? { [k]: a[k] } : {})),
    jsonArray = JSON.stringify(a),
    jsonObject = JSON.stringify(o);
    
console.log(a);
console.log(jsonArray);
console.log(o);
console.log(jsonObject);

var combined = Object.assign(JSON.parse(jsonArray), JSON.parse(jsonObject));

console.log(Array.isArray(combined));
console.log(combined);
console.log(Object.keys(combined).map(k => [k, combined[k]]));
.as-console-wrapper { max-height: 100% !important; top: 0; }

-1
投票

我认为这是不可能的(也许我错了),但是当你做a.push('hello')时,你将值hello分配给array的第一个索引。

console.log(a)
Array(
  0: "hello"
)

然后,当你执行a["hello"] = "world"时,你在这里做的是添加一个名为hello的索引,并为其指定world的值。

如果你记录它,你会得到:

Array (
  0: "hello",
  "hello": "world"
)
© www.soinside.com 2019 - 2024. All rights reserved.