2015-06-14 2 views
0

Итак, у меня проблема, и для жизни я не могу ее решить. Это кажется очень простым, но я просто не могу понять для меня, почему этот код не работает.Установка значения ключа ключа массива JavaScript

Моя проблема заключается в том, что я назначаю пару значений ключей массиву, но значения НЕ присваиваются. Это вопрос с переменной областью?

Вот мой код

function getcookie(cookiename){ 
    var mycookies = []; // The cookie jar 
    var temp = document.cookie.split(";"); 
    var key = ""; 
    var val = ""; 
    for(i=0;i<temp.length;i++){ 
     key = temp[i].split("=")[0]; 
     val = temp[i].split("=")[1]; 
     mycookies[key] = val; 
    } 
    return mycookies[cookiename]; 
} 
+0

серверы могут посылать куки ('Set-Cookie' заголовка) с односимвольный делиметр ";" 'doument.cookie' возвращает строку с двумя разделителями символов"; " – befzz

ответ

0

Обрезать ключ, потому что печенье строки выглядеть следующим образом:

«__utma = 250730393.1032915092.1427933260.1430325220.1430325220.1; __utmc = 250730393; __utmz = 250730393.1430325220.1.1.utmcsr = (прямой) | utmccn = (прямой) | utmcmd = (нет), не щелкает = 22; _gat = 1; _ga = GA1.2.1032915092.1427933260"

так, когда вы разбиваете на ; будет дополнительное пространство, прежде чем некоторые из ключевых имен ,

function getcookie(cookiename){ 
    var mycookies = []; // The cookie jar 
    var temp = document.cookie.split(";"); 
    var key = ""; 
    var val = ""; 
    for(i=0;i<temp.length;i++){ 
     key = temp[i].split("=")[0].trim(); // added trim here 
     val = temp[i].split("=")[1]; 
     mycookies[key] = val; 
    } 
    return mycookies[cookiename]; 
} 

Демо: JSBin

+1

То, что это было ... Ха-ха. Я понял это прямо перед тем, как вы ответили ... Спасибо всем –

0

mycookies должны быть заполнены при условии temp.length больше 0. Ваше возвращаемое значение всегда будет undefined; mycookies[cookiename] никогда не назначается значение.

Попробуйте добавить console.log(mycookies) непосредственно перед вашим оператором возврата.

0

Mycookies должно быть Object, а не Array.

var mycookies = {}; 
0

Мой друг, ты немного запутался (может быть, вы программировали на PHP), так как в JavaScript, Array не является ассоциативным ключ: значение объекта, это индексы основанный объект. Но то, что вы ищете является Объектом Буквального

function getcookie (cookiename){ 
    var i, max, keyvalue, key, val, 
     cookiesObj = {}, //empty object literal 
     cookiesArr = document.cookie.split(";"); 
    for(i=0, max=cookiesArr.length; i<max; i+=1) { 
     keyvalue = cookiesArr[i].split("="); 
     key = keyvalue[0].trim(); 
     val = keyvalue[1].trim(); 
     cookiesObj[key] = val; 
    } 
    return cookiesObj[cookiename]; 
} 

Но вы можете реорганизовать код:

function getcookie (cookiename) { 
    var cookie = "", 
     cookies = document.cookie.split(";"); 
    cookies.forEach(function (item) { 
     var keyvalue = item.split("="), 
      key = keyvalue[0].trim(), 
      val = keyvalue[1].trim(); 
     if (key === cookiename) { 
      cookie = val; 
      return false; //exit from iteration 
     } 
    }); 
    return cookie; 
} 
+0

Что ?? Все, что вы сделали, это сделать код менее понятным ... Код работает. Я просто не обрезал значения, чтобы удалить пробелы. –

+0

@BillyHallman, вы можете выбрать программирование не так, или хороший способ, приветствия! – jherax

+0

Мой предыдущий комментарий все еще стоит! :) –

0

JavaScript массивы не являются ассоциативными массивами, возможно только значение индекса числовое, начиная с 0 и заканчивающийся на array.length - 1. То, что вы, возможно, видели в примерах раньше или использовалось на другом языке раньше, было объектом JavaScript, который фактически ведет себя как ассоциативный массив. Вы можете получить доступ к значениям объектов на object['key'] или object.key. Первый используется только при доступе к ключу с использованием переменной или ключа, который включает в себя недопустимые символы, то есть some-key, в противном случае рекомендуется использовать точечный доступ, как показано во втором примере.

Поэтому ваша переменная mycookies должна быть объектом, а не массивом.

Если вы изменили свою линию var mycookies = []; на var mycookies = {};, то есть измените ее из пустого массива на пустой объект, оставшийся код должен работать так, как вы ожидали.

Ниже приведен пример фрагмент кода для фиксированного кода, я добавил макет печенье строку, поэтому он может надежно работать:

var mockCookies = "a=1;b=2;c=3"; 
 
function getcookie(cookiename){ 
 
    var mycookies = {}; // The cookie jar 
 
    var temp = mockCookies.split(";"); 
 
    var key = ""; 
 
    var val = ""; 
 
    for(i=0;i<temp.length;i++){ 
 
     key = temp[i].split("=")[0]; 
 
     val = temp[i].split("=")[1]; 
 
     mycookies[key] = val; 
 
    } 
 
    return mycookies[cookiename]; 
 
} 
 

 

 
function printCookie(name) { 
 
    alert(getcookie(name)); 
 
}
<button onclick="printCookie('a')">Get a</button> 
 
<button onclick="printCookie('b')">Get b</button> 
 
<button onclick="printCookie('c')">Get c</button>