设置数组键值对 JavaScript
Setting array key value pair 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];
}
mycookies
应假设 temp.length
大于 0。您的 return 值将始终为 undefined
; mycookies[cookiename]
从未被赋值。
尝试在 return 语句之前添加 console.log(mycookies)
。
Mycookies
应该是 Object
,而不是 Array
。
var mycookies = {};
Trim 您的密钥,因为 cookie 字符串如下所示:
"__utma=250730393.1032915092.1427933260.1430325220.1430325220.1; __utmc=250730393; __utmz=250730393.1430325220.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); clicks=22; _gat=1; _ga=GA1.2.1032915092.1427933260"
所以当你拆分 ;
时,一些键名前会有一个额外的 space。
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
我的朋友,你有点困惑(也许你在 PHP 中编程)因为在 JavaScript 中,Array
不是关联的 key : value 对象,它是一个基于 indexes 的对象。但是你要找的是 Object Literal
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;
}
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>
所以,我遇到了一个问题,而且我似乎无法解决它。这看起来很基础,但我就是无法理解为什么这段代码不起作用。
我的问题是,我正在将键值对分配给数组,但未分配值。是可变范围问题吗?
这是我的代码
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];
}
mycookies
应假设 temp.length
大于 0。您的 return 值将始终为 undefined
; mycookies[cookiename]
从未被赋值。
尝试在 return 语句之前添加 console.log(mycookies)
。
Mycookies
应该是 Object
,而不是 Array
。
var mycookies = {};
Trim 您的密钥,因为 cookie 字符串如下所示:
"__utma=250730393.1032915092.1427933260.1430325220.1430325220.1; __utmc=250730393; __utmz=250730393.1430325220.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); clicks=22; _gat=1; _ga=GA1.2.1032915092.1427933260"
所以当你拆分 ;
时,一些键名前会有一个额外的 space。
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
我的朋友,你有点困惑(也许你在 PHP 中编程)因为在 JavaScript 中,Array
不是关联的 key : value 对象,它是一个基于 indexes 的对象。但是你要找的是 Object Literal
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;
}
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>