【问题标题】:Simple way to import and export and store Arrays导入、导出和存储数组的简单方法
【发布时间】:2012-01-06 11:10:25
【问题描述】:

例如我有这样的东西。

var Ar : Array;
Ar[0] = 'apple';
Ar[3] = 'pineapple';
Ar[12] = 'car';
Ar[33] = 'dog';
Ar[41] = 'cat';
Ar[21] = 'apple';

我需要将它存储在简单的文本文件中。像这样

ArText : String ;
ArtText = "0-Apple,3-pineapple,12-car,33-dog,41-cat,21-apple"

你明白了。

将 Array 转换为可读字符串然后返回的最佳方法是什么? Javascript 代码将是最好的,但您几乎可以使用任何类似的代码。

【问题讨论】:

标签: javascript arrays import export


【解决方案1】:

我最初的冲动是将其直接转换为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;
}

【讨论】:

    【解决方案2】:

    如果数组中只是字符串,你可以使用Array对象上的join()方法来创建一个逗号分隔的字符串,然后在@上使用split()方法987654327@对象将字符串转换回数组。

    var Ar = new Array;
    Ar[0] = 'apple';
    Ar[3] = 'pineapple';
    Ar[12] = 'car';
    Ar[33] = 'dog';
    Ar[41] = 'cat';
    Ar[21] = 'apple';
    
    var stringRepresentation = Ar.join(",");
    var backToArray = stringRepresentation.split(";");
    

    你可以在这里看到这个工作; http://jsfiddle.net/ykQRX/。请注意,我还修复了您的无效 JavaScript (var Ar = new Array;)。

    【讨论】:

    • 你的代码会输出这样的字符串 "apple,,,pineapple,,,,,,,,,car,,,,,,,,,apple,,,,,,,,, ,,,dog,,,,,,,,cat" 它不是很可读。我需要更紧凑的东西,比如“1-apple, 3-pineapple...”
    猜你喜欢
    • 2012-11-23
    • 2014-09-28
    • 2011-09-26
    • 2018-11-23
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    相关资源
    最近更新 更多