2017-08-10 73 views
0

我有一個函數,它將來自我站點的dataLayer的信息推送到數組中。我希望能夠改變該陣列中的信息,但是我對如何實現這一目標感到不知所措。如何修改javascript數組的內容 - 可能使用forEach函數

這裏是從我的網站的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>

我創建通過transactionProducts陣列下面javascript函數環路,推動所有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']

我想acheive是這個數組(最好) - 或新的數組(如果更容易) - 只包含緊跟在「-p」後面的數字,如下所示。

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

我所有的產品網址與「-p」,然後任意數量的數字結束。

我想過使用正則表達式替換值productUrls.replace(/.+\-p/g, ''),但它不工作,我懷疑replace僅僅處理字符串,而不是數組的作品。

我懷疑使用forEach功能,正則表達式陣列內更換每個項目的工作,但我在所有的嘗試都慘遭失敗使用的。

任何幫助將不勝感激,因爲我有點JavaScript的新手。

回答

0

您通常使用Array#map重新映射你的價值觀,以一個新的數組:

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

Array#forEach版本是這樣的:

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

回調參數如下:

  • v - 用於當前va略
  • - 爲價值指數
  • 一個 - 的陣列的forEach被施加到(即processingUrls

從而a[i]=...將取代當前處理的陣列元件,用一個新值。

請注意,在大多數情況下(代碼風格/安全原因),使用map()仍然更可取。

+0

感謝。這工作得很好。我將'productUrls'映射到一個新數組,如你所說'var arr = productUrls.map(v => v.replace(/.+\- p /,''))''我現在能夠返回這個新的數組在我的函數結束。 – mickymac0

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 
} 
+0

這對我來說並不適用。首先'myRegexp'變量捕捉到我給出的例子url,但唯一需要的是最後的數字,所以'var myRegexp =/[0-9] + $/g'可以更好地工作。另外''var'從'url'變量'var url = dataLayer [0] .transactionProducts [i] .url'丟失了。我做的最後一項改變是將'productUrls.push(match [1])'改成'productUrls.push(match [0])'。 – mickymac0

相關問題