Как изменить содержимое массива JavaScript - возможно, с помощью функции forEach

У меня есть функция, которая помещает информацию из 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']

Все URL моего продукта заканчиваются на "-p", а затем на любое количество цифр.

Я думал об использовании регулярного выражения для замены значений productUrls.replace(/.+\-p/g, ''), но это не работает, и я подозреваю, что replace работает только со строками, а не с массивами.

Я подозреваю, используя forEach Функция регулярного выражения заменить каждый элемент в массиве будет работать, но я терплю неудачу во всех попытках использовать это.

Любая помощь будет принята с благодарностью, так как я являюсь новичком в JavaScript.

2 ответа

Решение

Обычно вы будете использовать Array#map для переназначения ваших значений в новый массив:

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

версия Array#forEach будет выглядеть так:

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

Аргументы обратного вызова следующие:

  • v - для текущего значения
  • я - для индекса значения
  • a - к которому применяется массив forEach (т. е. processingUrls)

тем самым a[i]=... заменит текущий обработанный элемент массива новым значением.

Обратите внимание, что с помощью map() все еще предпочтительнее в большинстве случаев (по стилю кода / по соображениям безопасности).

Я предлагаю вам захватить образец чисел в конце. Попробуйте это вместо этого:

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
}
Другие вопросы по тегам