hi我正在为一家网店编码,目前正在进行添加到购物车功能,喜欢将产品ID及其数量存储在cookie中,如id1:qt1、id2:qt2。。。喜欢检查产品是否已经在购物车中,看起来我的常规expr不起的作用
const reg = new RegExp(`${product_id}:d+`);
if (!reg.test(cart_cookie)){
const values = cart_cookie.split(',');
values.push(`${product_id}:1`);
setCookie('cart', values.join(','), 7);
}
else {
console.log('already in cart.')
}
是的,您的正则表达式已关闭:(
它让我困惑了一秒钟,但当你检查你的";regex";字符串实际上的计算结果为:/product_id:d+/
。这是因为您传入的字符串将d
视为文字d
。要解决这个问题,只需在其中放入另一个,这样原始的
就是被转义的内容。以前,您正在匹配
"apple:ddddddd"
之类的东西。
一旦你这样做了,你的代码似乎确实可以工作,但可能只是不像你期望的那样?我已经把你的代码放进了一个函数中,因为每次你想把一个项目添加到购物车中时,你都会调用这个函数,并添加了一个console.log
语句来显示";饼干">
// Just as a stand in for actual values
let cart_cookie = 'apples:2,oranges:3,bananas:1';
function addCartItem(product_id) {
const reg = new RegExp(`${product_id}:\d+`);
console.log(reg)
if (!reg.test(cart_cookie)){
const values = cart_cookie.split(',');
values.push(`${product_id}:1`);
console.log('cart_cookie is now ', values.join(','));
setCookie('cart', values.join(','), 7);
}
else {
console.log('already in cart.')
}
}
addCartItem('apples');
// already in cart.
addCartItem('kiwis');
// cart_cookie is now apples:2,oranges:3,bananas:1,kiwis:1
它是固定的!🥳但是我不太确定您的产品ID是什么样子的,但如果它们包含特殊字符(例如句点、问号等(,则会导致regex的性能出现一些问题。我怀疑你是否有问号之类的东西,但这样的东西说明了我的观点:
let cart_cookie = '123.15:3,2.5.141:1';
/* ... */
addCartItem('1.3.15');
// already in cart.
我知道,这是一种不太可能的情况——如果你知道你的产品ID不会包含任何棘手的内容,它甚至可能不适用于你——但如果你的目标是建立一个在线商店,你可能会想覆盖你的所有基础。即使解决了这个问题,这仍然是一个潜在的问题,因为这只会让你向购物车中没有的商品添加1的数量,之后无法增加。不确定这是否是你想要的。
这偏离了您提出的主要问题,但一个潜在的更好的解决方案可能是使用浏览器的本地存储(或会话存储(来跟踪购物车。这将允许你使用更熟悉的数据结构来存储这些信息,而不是一个你必须祈祷你正确解析的字符串。点击此处了解更多信息:https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage
您可以只使用数组方法,而不需要regex,例如
const values = cart_cookie.split(',');
values.foreach(value => {
if(value != product_id){
values.push(`${product_id}:1`);
setCookie('cart', values.join(','), 7);
}
});