Простой способ импорта и экспорта и хранения массивов - PullRequest
0 голосов
/ 06 января 2012

Например, у меня есть что-то вроде этого.

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"

Вы получили точку.

Каков наилучший способ преобразования массива в читаемую строку и обратно?Код Javascript будет лучшим, но вы можете использовать практически любой аналог.

Ответы [ 2 ]

4 голосов
/ 06 января 2012

Моим первоначальным импульсом было преобразовать его непосредственно в 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, используя JSON.stringify().Чтобы преобразовать его обратно, вы используете 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;
}
0 голосов
/ 06 января 2012

Если это просто строк в массиве, вы можете использовать метод join() для объекта Array для создания разделенной запятыми строки, а затем использовать split() метод объекта String для преобразования строки обратно в массив.

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;).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...