Превратить значения массива String в объект массива - PullRequest
1 голос
/ 23 июня 2009

Я передаю строку в скрытое поле на странице, а затем разбиваю ее, чтобы попытаться получить массив элементов, которые можно перебрать, и добавить несколько маркеров на карту Google. Если я жестко кодирую массив, он работает нормально, но если я пытаюсь разбить строку и использовать тот же код, он не работает. Я предполагаю, потому что разделение строки создает массив строк вместо объектов Array. Когда я разделяю строку, массив заканчивается на «['Smith Company', 33.61678, -111.90017]» с двойными кавычками вокруг него. Как бы я преобразовал эти элементы, чтобы использовать их так же, как жестко закодированные значения?

Я добавляю квадратные скобки, одинарные кавычки и строку вершин в StringBuilder в коде позади. Использование C # для этого, если это будет иметь значение. Я не женат, чтобы делать это таким образом, но все еще зеленый с JavaScript, так что это было мое первоначальное решение. Моя начальная строка выглядит так "

"['Jones Company', 26.16683, -98.23342]|['Smith Company', 33.61678, -111.90017]|['Bob Company', 29.70008, -98.03347]|['Blue Company', 37.71675, -122.21672]|['Red Company', 42.46692, -114.48342]"

Спасибо.

function initialize() {
        var myOptions = {
            zoom: 4,
            center: new google.maps.LatLng(26.16683, -98.23342),
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };

        var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

        //What I try to use when the hard coded is commented out
        var myString = document.getElementById('hdnString').value;
        var myItems = new Array();
        myItems = myString.split("|");

        //Hard coded items that I comment out when trying the above
        var myItems = [
            ['Jones Company', 26.16683, -98.23342],
            ['Smith Company', 33.61678, -111.90017],
            ['Bob Company', 37.71675, -122.21672],
            ['Blue Company', 42.46692, -114.48342],
            ['Red Company', 36.58339, -121.8335]
        ];

            // Add markers to the map
            for (var i in myItems){
                var myLatLng = new google.maps.LatLng(myItems[i][1], myItems[i][2]);
                var marker = new google.maps.Marker({
                    position: myLatLng,
                    map: map,
                    title: myItems[i][0]
                });
            }
        }

Ответы [ 4 ]

2 голосов
/ 24 июня 2009

Вам нужно будет использовать eval() для преобразования строковых представлений массивов в фактические массивы JavaScript.

Этот код должен работать:

var myString = document.getElementById('hdnString').value;
var myItems = [];
var rawItems = myString.split("|");

for (var i=0; i<rawItems.length; i++){
    myItems.push(eval(rawItems[i]));
}

Обратите внимание, что eval - зло , за исключением , когда оно не .

1 голос
/ 24 июня 2009

Вы можете попробовать использовать форматированный текст JSON в скрытом поле. Затем вы можете разобрать JSON в реальные объекты JavaScript. Если я правильно понимаю ваше скрытое поле, вам просто понадобится строка, похожая на

<input id="myItemList"  type="hidden" value="{'myItems' = [
            ['Jones Company', 26.16683, -98.23342],
            ['Smith Company', 33.61678, -111.90017],
            ['Bob Company', 37.71675, -122.21672],
            ['Blue Company', 42.46692, -114.48342],
            ['Red Company', 36.58339, -121.8335]
        ]}"/>

Тогда в JavaScript:

// this is an array
var myItems = JSON.parse(document.getElementById("myItemList").value)["myItems"];
0 голосов
/ 23 июня 2009

Вы можете просто сделать

var myItems = myString.split("|");

вместо

var myItems = new Array();
myItems = myString.split("|");

в качестве функции split вернет массив строк. Если бы вы могли опубликовать значение hdnString, я мог бы помочь вам в дальнейшем, но, глядя на ваш код, вам нужен массив массивов.

EDIT:

Предполагая

hdnString = "'Jones Company', 26.16683, -98.23342|
            'Smith Company', 33.61678, -111.90017|
            'Bob Company', 37.71675, -122.21672|
            'Blue Company', 42.46692, -114.48342|
            'Red Company', 36.58339, -121.8335|";

что-то вроде следующего даст вам массив массивов

var myItems = hdnString.split("|");
for( var i = 0; i< myItems.length; i++)
    myItems[i] = myItems[i].split(",");
0 голосов
/ 23 июня 2009

В вашем случае это не работает с расщеплением, потому что расщепление дает вам простой массив, тогда как в жестко закодированном вами случае вы используете массив массивов, который немного отличается. Все, что вам нужно сделать, это определить другой разделитель для каждой записи и сначала разделить ее, а затем разделить на «|».

Я имею в виду:

var string = "first record|valueA|valueB;second record|valueA|valueB";
var firststep = string.split(";");
for ( var tmp in firststep)
{
    secondstep = tmp.split("|");
    //secondstep[0] = first record; secondstep[1] = valueA and etc...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...