2017-08-10 4 views
0

J'ai une fonction qui pousse les informations de dataLayer de mon site dans un tableau. Je veux être en mesure de changer ensuite l'information dans ce tableau, mais je ne sais pas comment y parvenir.Comment modifier le contenu d'une matrice javascript - éventuellement en utilisant la fonction forEach

Voici un exemple de la couche de données de HTML de mon site:

<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>

J'ai créé ce qui suit la fonction javascript à boucle à travers le réseau transactionProducts et pousser tous les url valeurs dans un tableau appelé 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 
 
}

Maintenant, quand je l'appelle la fonction getProductUrls(), il fonctionne comme prévu et pousse les valeurs dans le tableau productUrls comme suit:

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

Ce que je veux acheive est ce tableau (de préférence) - ou un nouveau tableau (si plus facile) - ne contenant que les nombres qui suivent immédiatement le "-p" comme suit.

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

Tous mes urls produits se terminent par « -p » et un certain nombre de chiffres.

J'ai pensé à l'aide d'une expression régulière pour remplacer les valeurs productUrls.replace(/.+\-p/g, ''), mais cela ne fonctionne pas et je pense que replace fonctionne uniquement avec des chaînes et non des tableaux. Je suppose que l'utilisation d'une fonction forEach pour regex remplacer chaque élément dans le tableau fonctionnerait, mais je échoue misérablement dans toutes les tentatives d'utiliser cela.

Toute aide serait grandement appréciée, car je suis un peu novice javascript.

Répondre

0

Normalement, vous utiliserez Array#map pour remapper vos valeurs à un nouveau tableau:

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

une version Array#forEach ressemblera à ceci:

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

Les arguments de rappel sont les suivants:

  • v - est pour courant va Lue
  • i - est l'indice de valeur
  • un - un tableau forEach est appliquée au (à savoirprocessingUrls)

ainsi a[i]=... va remplacer l'élément de réseau en cours de traitement, avec une nouvelle valeur. Notez que l'utilisation de map() est toujours préférable dans la plupart des cas (pour des raisons de style de code/de sécurité).

+0

Merci. Cela a fonctionné un régal. J'ai mappé 'productUrls' à un nouveau tableau comme vous l'avez dit' var arr = productUrls.map (v => v.replace (/.+\- p /, '')) 'et je suis maintenant capable de retourner cette nouvelle tableau à la fin de ma fonction. – mickymac0

0

Je vous suggère de capturer le motif des nombres à la fin. Essayez ceci:

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

Cela n'a pas fonctionné pour moi au début. Tout d'abord, la variable 'myRegexp' capture les exemples d'URL que j'ai donnés, mais la seule chose qui était nécessaire était les nombres à la fin, donc' var myRegexp =/[0-9] + $/g' fonctionne mieux. De plus, 'var' manquait de la variable' url' 'var url = dataLayer [0] .transactionProducts [i] .url'. La dernière modification que j'ai faite était de changer 'productUrls.push (match [1])' en 'productUrls.push (match [0])'. – mickymac0