设置数组键值对 JavaScript

Setting array key value pair JavaScript

本文关键字:JavaScript 键值对 数组 设置      更新时间:2023-09-26

所以,我遇到了一个问题,对于我的生活,我似乎无法解决它。这看起来很基本,但我一辈子都无法理解为什么这段代码不起作用。

我的问题是,我正在为数组分配一个键值对,但值没有被分配。这是一个可变范围的问题吗?

这是我的代码

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];
}

修剪您的密钥,因为 cookie 字符串如下所示:

"__utma=250730393.1032915092.1427933260.1430325220.1430325220.1;__utmc=250730393;__utmz=250730393.1430325220.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none);点击次数=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

假设temp.length大于 0 时应填充mycookies。您的返回值将始终undefined; mycookies[cookiename]永远不会被分配一个值。

尝试在返回语句之前添加console.log(mycookies)

Mycookies应该是一个Object,而不是一个Array

var mycookies = {};

JavaScript 数组不是关联数组,只有可能的索引值是数字,从 0 开始,到 array.length - 1 结束。你可能在之前的例子中看到过,或者之前在另一种语言中使用过JavaScript对象,它实际上表现为一个关联数组。您可以按object['key']object.key访问对象值。第一种仅在使用变量或包含非法字符的键访问键时使用,即 some-key ,否则建议使用点访问,如第二个示例所示。

因此,mycookies变量应该是一个对象,而不是数组。

如果您将行var mycookies = [];更改为 var mycookies = {}; ,即将其从空数组更改为空对象,则剩余的代码应按预期工作。

这是一个固定代码的示例片段,我添加了一个模拟 cookie 字符串,以便它可以可靠地工作:

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>

我的朋友,你有点困惑(也许你已经用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;
}