js动态正则表达式



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

最新更新