0

我有一个将信息从我的站点的 dataLayer 推送到数组中的函数。我希望能够更改该数组中的信息,但我不知道如何实现这一点。

以下是我网站 HTML 中数据层的示例:

<script type="text/javascript">
  var dataLayer = dataLayer || [];
  dataLayer.push({
    'transactionId': 'xxx',
    'transactionAffiliation': 'xxx',
    'transactionTotal': 27.95,
    'transactionTax': 4.46,
    'transactionGoodsNet': 18.49,
    'transactionGoodsNetNoDiscount': 18.49,
    'transactionGoodsTax': 3.51,
    'transactionShipping': 5.95,
    'transactionTotal_currency': 27.95,
    'transactionTax_currency': 4.46,
    'transactionGoodsNet_currency': 18.49,
    'transactionGoodsNetNoDiscount_currency': 18.49,
    'transactionGoodsTax_currency': 3.51,
    'transactionShipping_currency': 5.95,
    'transactionExchangeRate': 1.00,
    'transactionProducts': [{
      'sku': 'sku1',
      'name': 'name1',
      'brand': 'Unbranded',
      'category': 'xxxx',
      'price': 6.00,
      'price_ex': 5.04,
      'image': 'xxx_image1.jpg',
      'url': 'url1-p2180',
      'quantity': 1
    }, {
      'sku': 'sku2',
      'name': 'name2',
      'brand': 'Unbranded',
      'category': 'xxxx',
      'price': 6.00,
      'price_ex': 5.04,
      'image': 'xxx_image2.jpg',
      'url': 'url2-p2180',
      'quantity': 1
    }, {
      'sku': 'sku3',
      'name': 'name3',
      'brand': 'Unbranded',
      'category': 'xxxx',
      'price': 5.00,
      'price_ex': 4.20,
      'image': 'xxx_image3.jpg',
      'url': 'url3-p1448',
      'quantity': 1
    }, {
      'sku': 'sku4',
      'name': 'name4',
      'brand': 'Unbranded',
      'category': 'xxxx',
      'price': 5.00,
      'price_ex': 4.20,
      'image': 'xxx_image4.jpg',
      'url': 'url4-p1448',
      'quantity': 1
    }],
    'transactionProductCount': 4,
    'transactionDiscount': 0,
    'transactionDiscountNet': 0,
    'transactionDiscountTax': 0
  });
</script>

我创建了以下 javascript 函数来循环遍历transactionProducts数组并将所有url值推送到一个名为的数组中productUrls

function getProductUrls() {
  var productUrls = []
  var numberProducts = dataLayer[0].transactionProductCount
  for (var i = 0; i < numberProducts; i++) {
    productUrls.push(dataLayer[0].transactionProducts[i].url)
  }
  return productUrls
}

现在,当我调用该getProductUrls()函数时,它按预期工作并将值推送到productUrls数组中,如下所示:

['url1-p2180','url2-p2180','url3-p1448', 'url4-p1448']

我想要实现的是这个数组(最好) - 或一个新数组(如果更容易的话) - 只包含紧跟“-p”的数字,如下所示。

['2180','2180','1448','1448']

我所有的产品网址都以“-p”结尾,然后是任意位数。

我曾考虑使用正则表达式来替换 values productUrls.replace(/.+\-p/g, ''),但它不起作用,我怀疑replace它只适用于字符串而不适用于数组。

我怀疑使用forEach正则表达式替换数组中的每个项目的函数会起作用,但我在所有尝试使用它时都失败了。

任何帮助将不胜感激,因为我有点 javascript 新手。

4

2 回答 2

0

您通常会使用Array#map将值重新映射到新数组:

productUrls.map(v=>v.replace(/.+\-p/,''))

Array#forEach版本将如下所示:

processingUrls.forEach((v,i,a)=>a[i]=v.replace(/.+\-p/,''))

回调参数如下:

  • v - 用于当前值
  • i - 用于价值指数
  • a - 正在应用一个数组 forEach(即processingUrls

从而a[i]=...将当前处理的数组元素替换为新值。

请注意,map()在大多数情况下,使用仍然是可取的(出于代码风格/安全原因)。

于 2017-08-10T10:15:58.113 回答
0

我建议你在最后捕捉数字的模式。试试这个:

function getProductUrls() {
   var productUrls = []
   var numberProducts = dataLayer[0].transactionProductCount
   for (var i = 0; i < numberProducts; i++) {
     var myRegexp = /url[0-9]+\-p([0-9]+)/g;
     url  = dataLayer[0].transactionProducts[i].url;
     var match = myRegexp.exec(url);
     productUrls.push(match[1])
   }
   return productUrls
}
于 2017-08-10T10:20:55.497 回答