2010-07-15 3 views
3

Я не гуру javascript. У меня есть следующий код ниже:Установка объекта в разделенный массив

var aCookieValues = sCookieContentString.split('&'); // split out each set of key/value pairs 
var aCookieNameValuePairs = aCookieValues.split('='); // return an array of each key/value 

То, что я пытаюсь сделать, это разделить первую строку с помощью &, а затем создать другой массив, который принимает первый массив и раскалывает его дальше через = символ, который существует в каждом значении в массиве aCookieValues ​​

Я получаю сообщение об ошибке aCookieValues.split не является функцией.

Я видел пример, что в принципе делает то же самое, но во второй раз этот парень с помощью цикла:

(http://seattlesoftware.wordpress.com/2008/01/16/javascript-query-string/)

// '&' seperates key/value pairs 
    var pairs = querystring.split("&"); 

    // Load the key/values of the return collection 
    for (var i = 0; i < pairs.length; i++) { 
     var keyValuePair = pairs[i].split("="); 
     queryStringDictionary[keyValuePair[0]] = keyValuePair[1]; 
    } 

В конце концов, что я пытаюсь достичь здесь - это окончательный словарь с парами ключ/значение, основанный на разделении «=». Я просто пытаюсь разделить значения cookie и вставить его в хороший словарь, чтобы впоследствии получить некоторые значения из этого словаря.

+2

Почему бы вам не использовать алгоритм, который у вас уже есть? – Gumbo

+0

какой алгоритм. Вы говорите о втором примере? это из блога этого парня. И, честно говоря, я не совсем понимаю пару вещей, которые он делает, таких как = {}; и как он создает словарь в JavaScript. Там нет словарей в JavaScript? – PositiveGuy

+0

@ coffeeaddict: Все словари в JavaScript :) –

ответ

3

Вы получаете эту ошибку, потому что aCookieValues - это массив, и у него нет метода split. Вы должны были бы вызвать метод split на каждом элементе aCookieValues:

var aCookieValues = sCookieContentString.split('&'); 

for (var i = 0; i < aCookieValues.length; i++) { 
    var aCookieNameValuePairs = aCookieValues[i].split('='); 

    // Handle aCookieNameValuePairs[0] as the key 
    // Handle aCookieNameValuePairs[1] as the value 
} 

впихнуть все в вашем хорошем словаре, просто объявить его до того, как цикл: var myDict = {}, а затем положить следующий после split('=') вызова:

myDict[aCookieNameValuePairs[0]] = aCookieNameValuePairs[1]; 

EDIT: Что, прочитав ваш вопрос правильно, это тот же самый метод, используемый в фрагменте кода вы указали. Надеюсь, по крайней мере, это объясняет, как это работает :)

+0

Мне просто интересно, как не делать это с петлей во второй раз. – PositiveGuy

+0

это линия, которую я не получаю. myDict [aCookieNameValuePairs [0]] = aCookieNameValuePairs [1]; И я не знал, что есть JavaScript-словари после попытки найти его ... нет, похоже, но я нашел хорошую статью, наконец, http://www.4guysfromrolla.com/webtech/100800-1.shtml – PositiveGuy

+0

Вы должны использовать цикл. На самом деле вы могли бы использовать ['map()'] (https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map), но это довольно продвинутый вариант, и это всего лишь сокращение для прокрутки всех элементов массива. (И это не работает во всех браузерах). –

1

split работает на строке. Вы пытаетесь разделить aCookieValues, который представляет собой массив. Пример, который вы цитируете, - это цикл по массиву, а затем разделение каждого элемента как строки.

Просто для удовольствия одним из способов борьбы с этим было бы использовать функцию map, которая выполняет действие над каждым элементом массива и испускает массив в результате. Если вы общая функция карты доступны для всех массивов, например:

if (!Array.prototype.map) { // don't step on anyone's toes 
    Array.prototype.map = function(f) { 
    var result = []; 
    var aLen = this.length; 
    for(x = 0 ; x < aLen ; x++) { 
     result.push(f(this[x])); 
    } 
    return result; 
    }; 
}; 

... Вы можете назвать его как метод на массиве непосредственно. Таким образом:

​yourstring = 'x=3&y=4&zed=blah&something=nothing'; 
dictionary = yourstring.split('&').map(function(a){ return a.split('='); }); 

dictionary теперь будет хороший чистый массив (массивы) пар имя/значение, например:

[["x", "3"], ["y", "4"], ["zed", "blahblah"], ["something", "nothing"]] 

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

+0

спасибо, я еще не продвинулся в JS ... не знаю карт. – PositiveGuy

+0

Я не понимаю, как переданная функция с параметром x работает ... это в основном какой-то делегат? – PositiveGuy

+0

Функция карты, указанная выше, определяется как аргумент 'f'. В теле 'map' мы видим, что аргумент' f' - это функция, которая вызывается внутри цикла 'for' -' f (this [x]) '. Аргумент, переданный в это 'this [x]' - значение, текущий элемент исходного массива, о котором идет речь. Подумайте о 'function (a)' code (я изменил его на 'a' для ясности) как своего рода шаблон - общий вид функции, которую мы хотим передать на« map ». Когда функция фактически применяется внутри 'map', мы просто говорим:« Возьмите фактический аргумент и сложите его там, где у нас был 'a' в этом« шаблоне ». –

1

Во второй строке вы пытаетесь вызвать split() для массива, когда это функция, определенная в строках.

Пример:

"a=1&b=2&c=3".split('&') returns an array ['a=1','b=2','c=3'] 

Ваш код будет затем вызвать раскол в массиве:

['a=1','b=2','c=3'].split('=') 

Но эта функция не существует. Похоже, ваша цель состоит в том, чтобы разделить каждую строку в массиве, поэтому пример, который вы задали в вопросе, кажется уместным - проведите через каждый элемент и разделите его.

+0

спасибо ... Я вижу это сейчас. – PositiveGuy

Смежные вопросы