是的,您的正则表达式已关闭 :)
它难倒了我一秒钟,但是当您检查“正则表达式”字符串 实际上 的计算结果时,它就很清楚了:/product_id:d+/。这是因为您传入的字符串将\d 视为文字d。要解决这个问题,只需将另一个\ 扔进去,这样原来的\ 就会被转义。之前,您匹配的是 "apple:ddddddd" 之类的内容。
一旦你这样做了,你的代码似乎可以工作,但可能只是不像你期望的那样?
我已将您的代码放入一个函数中,因为您可能会 - 大概 - 每次您想将商品添加到购物车时都会调用它,并添加了 console.log 语句以显示“cookie”的最终值。 "
// 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 是什么样的,但如果它们包含特殊字符(例如句点、问号等),则会导致您的正则表达式的执行方式出现一些问题。我怀疑你里面有问号之类的东西,但这样的东西说明了我的观点:
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