【问题标题】:js dynamic regular expr [duplicate]js动态正则表达式[重复]
【发布时间】:2021-11-29 18:34:56
【问题描述】:

您好,我正在为一家在线商店编写代码, 目前正在开发添加到购物车功能, 喜欢将产品 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.')
            }

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    是的,您的正则表达式已关闭 :)

    它难倒了我一秒钟,但是当您检查“正则表达式”字符串 实际上 的计算结果时,它就很清楚了:/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

    【讨论】:

      【解决方案2】:

      您可以只使用数组方法,而不需要使用正则表达式, 比如……

      const values = cart_cookie.split(',');
      values.foreach(value => { 
       if(value != product_id){
         values.push(`${product_id}:1`);
         setCookie('cart', values.join(','), 7);
       }
      });
      

      【讨论】:

      • 值将像这样 12:3 并且产品 id 只是一个数字,例如 12 product_id:quantity 您的代码会将 values.length 元素添加到数组并同时设置 cookie
      猜你喜欢
      • 2013-04-15
      • 1970-01-01
      • 2021-06-19
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多