我有一个getter从cookie中获取值。
现在我有了两个cookie,名字分别是shares=和obligation =。
我想让这个getter只从义务cookie中获取值。
我怎么做呢?因此for语句将数据拆分为单独的值,并将其放入数组中。
function getCookie1() {
// What do I have to add here to look only in the "obligations=" cookie?
// Because now it searches all the cookies.
var elements = document.cookie.split('=');
var obligations= elements[1].split('%');
for (var i = 0; i < obligations.length - 1; i++) {
var tmp = obligations[i].split('$');
addProduct1(tmp[0], tmp[1], tmp[2], tmp[3]);
}
}
现在,当以数组格式存储cookie时,可以让cookie以数组形式返回。
例如,你的cookie数组[35]=Khóa;数组[36]= Tử;数组[37]= Cử;
这段代码也包含utf8。
当你的cookie名称内容[]在其中,而你存储的cookie不在数组中时,一件事不会很好地工作。
function getCookie(cname) {
var ca = decodeURIComponent(document.cookie).split(';');
if (cname.indexOf('[]') > 0) {
var returnVAlue = [];
var nameArray = cname.replace("[]", "");
for(var i = 0; i < ca.length; i++) {
var c = ca[i];
// console.log(c);
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(nameArray) >= 0) {
var valueString = c.substr(nameArray.length, c.length);
var valueStringSlit = valueString.split('=');
valueStringSlit[0] = valueStringSlit[0].substr(1,(valueStringSlit[0].length - 2));
// console.log(valueStringSlit);
returnVAlue.push(valueStringSlit);
}
}
} else {
var returnVAlue = '';
var name = cname + "=";
for(var i = 0; i < ca.length; i++) {
var c = ca[i];
// console.log(c);
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
returnVAlue = c.substr(name.length, c.length);
}
}
}
if (returnVAlue != ''){
return returnVAlue;
}
return "";
}
// console.log(decodeURIComponent(document.cookie));
console.log(getCookie('array[]'));
其他一些使用正则表达式的答案中的方法并不涵盖所有情况,特别是:
当饼干是最后一块时。在这种情况下,cookie值后不会有分号。
当另一个cookie名称以正在查找的名称结束时。例如,您正在寻找名为“one”的cookie,而有一个名为“done”的cookie。
cookie名称中包含的字符在正则表达式中使用时不会被解释为字符本身,除非它们前面有反斜杠。
下面的方法可以处理这些情况:
function getCookie(name) {
function escape(s) { return s.replace(/([.*+?\^$(){}|\[\]\/\\])/g, '\\$1'); }
var match = document.cookie.match(RegExp('(?:^|;\\s*)' + escape(name) + '=([^;]*)'));
return match ? match[1] : null;
}
如果没有找到cookie,将返回null。如果cookie值为空,则返回空字符串。
注:
这个函数假设cookie名称是区分大小写的。
文档。cookie——当this出现在赋值的右侧时,它表示一个字符串,其中包含一个以分号分隔的cookie列表,这些cookie又是名称=值对。每个分号后面似乎都有一个空格。
String.prototype.match() -当没有找到匹配时返回null。找到匹配项时返回一个数组,索引[1]处的元素是第一个匹配组的值。
正则表达式
(?:xxxx) -组成不匹配的组。
^ -匹配字符串的开头。
| -为组分离可选模式。
\\s* -匹配一个分号后面跟着零个或多个空格。
= -匹配一个等号。
(xxxx) -组成匹配组。
[^;]* -匹配零个或多个分号以外的字符。这意味着它将匹配最大(但不包括)分号或字符串末尾的字符。
一种避免在数组上迭代的方法是:
function getCookie(name) {
const value = `; ${document.cookie}`;
const parts = value.split(`; ${name}=`);
if (parts.length === 2) return parts.pop().split(';').shift();
}
预排
如果字符串中不存在令牌,则通过令牌分割字符串将生成一个包含一个字符串(相同值)的数组;如果字符串中存在令牌,则生成一个包含两个字符串的数组。
第一个(左)元素是标记之前的字符串,第二个(右)元素是标记之后的字符串。
(注意:如果字符串以令牌开头,第一个元素为空字符串)
考虑到cookie的存储方式如下:
"{name}={value}; {name}={value}; ..."
为了检索特定的cookie值,我们只需要获取“;”之后的字符串;{name}=" and before next ";"。在进行任何处理之前,在cookie字符串前加上";,这样每个cookie名称,包括第一个,都包含“;And "=":
"; {name}={value}; {name}={value}; ..."
现在,我们可以先用";{name}=",如果token在一个cookie字符串中找到(即我们有两个元素),我们将以第二个元素为以我们的cookie值开头的字符串结束。然后我们从数组中取出它(即pop),并重复相同的过程,但现在使用“;”作为标记,但这次取出左边的字符串(即shift)以获得实际的标记值。