我最初的冲动是将其直接转换为JSON,但后来我意识到JSON.stringify() 会返回如下内容:
["apple",null,null,"pineapple",null,null,null,null,null,null,null,null,"car",null,null,null,null,null,null,null,null,"apple",null,null,null,null,null,null,null,null,null,null,null,"dog",null,null,null,null,null,null,null,"cat"]
因为你的数组有一堆未定义的槽,它们都变成了null,因为 JSON 不支持未定义的值。如果您只需要存储它就可以了,除非当您将它转换回数组时,您最终会到处都是空值而不是未定义,因此您必须允许这样做(不是什么大问题),但在任何情况下听起来你也希望它是人类可读的。
因此,我建议您将其转换为对象,然后使用JSON.stringify() 将对象转换为 JSON。要将其转换回来,请使用 JSON.parse() 将字符串转换为对象,然后遍历对象属性以创建稀疏数组。
我的提议会产生这样的 JSON 字符串:
{"0":"apple","3":"pineapple","12":"car","21":"apple","33":"dog","41":"cat"}
代码:
function sparseArrayStringify(arr) {
var obj = {},
i;
for (i=0; i < arr.length; i++)
if (typeof arr[i] != "undefined")
obj[i] = arr[i];
return JSON.stringify(obj);
}
function parseToSparseArray(str) {
var arr = [],
obj = JSON.parse(str),
k;
for (k in obj)
arr[k] = obj[k];
return arr;
}
var stringifiedArray = sparseArrayStringify(Ar); // where Ar is your array
// and change it back
var anArray = parseToSparseArray(stringifiedArray);
工作演示:http://jsfiddle.net/XXqVD/
注意:在我的parseToSparseArray() 函数中,我没有费心测试正在解析的字符串中对象的属性实际上是非负整数,但如果需要,您可以添加它。
较新的浏览器支持带有关联方法的 JSON 对象,或者对于较旧的浏览器,您可以包含 json2.js 库。
顺便说一句,您问题中的代码是无效的 JavaScript:您不能在 JS 中声明具有类型的变量。请参阅我的代码中的示例,了解如何声明数组、对象等。
编辑:好的,当 JSON 是一种众所周知的标准格式时,我不知道你到底为什么想要非 JSON 版本,但这里有一些未经测试的函数,它们可以完全读取和写入格式问题:
"0-Apple,3-pineapple,12-car,33-dog,41-cat,21-apple"
请注意,如果任何数组元素包含逗号或连字符,您建议的格式将不起作用。这就是为什么 JSON 是您应该采用的方式。无论如何:
function serialiseArray(arr) {
var workingArray = [],
i;
for (i=0; i < arr.length; i++)
if (typeof arr[i] != "undefined")
workingArray.push(i + "-" + arr[i]);
return workingArray.join(",");
}
function deserialiseArray(str) {
var arr = [],
items = str.split(","),
item,
i;
for (i=0; i < items.length; i++) {
item = items[i].split("-");
arr[item[0]] = item[1];
}
return arr;
}