【问题标题】:Check if two URL strings are equal检查两个 URL 字符串是否相等
【发布时间】:2020-10-23 21:11:33
【问题描述】:

我正在构建一个函数来处理动态电话号码交换,识别referral url,通过数据集进行映射,然后输出promoUrl 的相关电话号码。数据格式如下:

const phoneNumbers = [
  {
    promoUrl: '/interior-doors/',
    promoNumber: '589-918-0710',
  },
  {
    promoUrl: '/promo4/',
    promoNumber: '307-789-8615',
  },
];

函数映射数据并减少它,让我可以像这样对它进行排序:

const url = location.pathname.replace(/\/+$/, '');

const promoNumber = phoneNumbers.reduce((promoNumber, results) => {
  const hasPromo = results.promoUrl.includes(url);

  if (hasPromo) {
    return results.promoNumber;
  }
    return promoNumber;
}, '');

我在使用 hasPromo 时遇到了一些问题。它现在的构建方式允许 promoUrl 有一些差异并且仍然可以工作,这意味着只要它包含从 url 返回的内容,那么它就可以工作,即/interior-doors//interior-doorsinterior-doors 都可以工作,这很好,但如果 url/interior-do 也可以。我需要它不要那样做。它应该独立于格式工作,但只有在字母字符串准确时才返回promoNumber

我假设这是 regex 的事情,但我不知道我在用 regex 做什么。任何帮助将不胜感激。

【问题讨论】:

    标签: javascript constants string-comparison


    【解决方案1】:

    使用== 进行精确匹配。由于promoURL 属性总是有/ 围绕它,所以在设置url 时添加这些分隔符

    const url = '/' + location.pathname.replace(/\/+$/, '') + '/';
    
    const promoNumber = phoneNumbers.reduce((promoNumber, results) => {
      const hasPromo = results.promoUrl == url;
    
      if (hasPromo) {
        return results.promoNumber;
      }
      return promoNumber;
    }, '');
    

    reduce 似乎也是错误的功能。您只需找到匹配的promoUrl,您不必继续归约,因为归约函数不会以任何方式合并结果。

    const promo = phoneNumbers.find(({promoUrl}) => promoUrl == url);
    const promoNumber = promo ? promo.promoNumber : '';
    

    【讨论】:

    • 太棒了,这太完美了。非常感谢,节省了很多代码。
    • 快速澄清问题:如果promoUrl 周围没有/,我仍然需要它来工作;一旦网站上线,promoUrls 的创建将不再是开发人员,我宁愿让它万无一失。这可能吗?
    • 最好是您提供给非开发人员的工具确保它以一致的格式创建它们。
    • 您可以使用results.promoUrl == url || results.promoUrl == '/' + url + '/' 来处理这两种格式。
    • 代替results.promoUrl == url。然后在初始化url时不要添加/
    猜你喜欢
    • 2015-10-30
    • 2018-06-07
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 2020-11-09
    相关资源
    最近更新 更多