2017-09-05 2 views
1

Je reçois la réponse suivante des activités d'une source de données. Ceux-ci ont des heures de début uniques et peuvent appartenir au même produit.réarranger un tableau avec un objet imbriqué (JS)

Actuellement l'objet Informations produit est imbriqué dans l'activité. J'ai essayé sans succès de "réarranger" et de regrouper les informations.

La structure I requise est d'avoir un produit (productCode) avec des activités avec le même code de produit dans l'objet au sein du produit. par ex. "productCode": "PTFTVD" "activités": [{activité 1, activité 2 etc.}]

var activities = [ 
    { 
    "id":39170350, 
    "productCode":"PTFTVD", 
    "startTime":"2017-09-06T00:00:00Z", 
    "endTime":"2017-09-06T05:30:00Z", 
    "startTimeLocal":"2017-09-06 10:00:00", 
    "endTimeLocal":"2017-09-06 15:30:00", 
    "product":{ 
    "productCode":"PTFTVD", 
    "productType":"DAYTOUR", 
    "name":"01 Koala & River Cruise - Return cruise with Entry into Lone Pine", 
    "shortDescription":"The Koala and River Cruise is a memorable" 
    } 
    }, 
{ 
    "id":41498876, 
    "productCode":"PJIOQO", 
    "startTime":"2017-09-06T04:15:00Z", 
    "discount":{ 
    "id":7, 
    "title":"Discount Rulezzz" 
    }, 
    "product":{ 
    "productCode":"PJIOQO", 
    "productType":"CUSTOM", 
    "name":"1 Hour 15 Minute Segway Joy Ride Experience", 
    "shortDescription":"Tour Length 14km approx. " 
    } 
    }, 
    { 
    "id":41498757, 
    "productCode":"PJIOQO", 
    "startTime":"2017-09-07T04:15:00Z", 
    "product":{ 
    "productCode":"PJIOQO", 
    "productType":"CUSTOM", 
    "name":"1 Hour 15 Minute Segway Joy Ride Experience", 
    "shortDescription":"Tour Length 14km approx. Almost non stop segway r…nd we custom make this tour to " 
    } 
    }, 
    { 
    "id":41498846, 
    "productCode":"PJIOQO", 
    "startTime":"2017-09-08T04:15:00Z", 
    "product":{ 
    "productCode":"PJIOQO", 
    "productType":"CUSTOM", 
    "name":"1 Hour 15 Minute Segway Joy Ride Experience", 
    "shortDescription":"Tour Length 14km approx. Almost non stop segway r…nd we custom" 
    } 
    }, 
    { 
    "id":41498600, 
    "productCode":"PJIOQO", 
    "startTime":"2017-09-09T04:15:00Z", 
    "product":{ 
    "productCode":"PJIOQO", 
    "productType":"CUSTOM", 
    "name":"1 Hour 15 Minute Segway Joy Ride Experience", 
    "shortDescription":"Tour Length 14km approx. Almost non stop segway r…nd we custom make this tour t" 
    } 
    } 
] 
+0

grande, ce qui ne fonctionne pas? Merci d'ajouter votre code. –

+0

Démarrer en utilisant la fonction _.groupBy dans Lodash le code produit, qui devrait vous aider à démarrer, il vous donnera un objet comme '{ « PJIOQO »: [produits], ...}' –

Répondre

0

Fondamentalement, une commutation de données sont regroupées en deux étapes:

  1. Groupe du produit ,
  2. Recueillir des activités pour un produit.

Pour 1, vous avez besoin d'une structure de données interrogeable, comme un objet ou un Map, où vous avez une clé et des données collectées.

Ici, vous pouvez utiliser la productCode comme clé et prendre les données de product comme nouvelles valeurs. Ajoutez ensuite une propriété pour collecter les activités.

Utilisez un tableau pour le jeu de résultats et pousser un nouveau produit à l'ensemble de résultats, alors que le produit est toujours accessible avec la clé dans l'objet.

Allez maintenant à 2. et de rassembler toutes les données et attribuer à l'ensemble des activités.

Voila!

var activities = [{ id: 39170350, productCode: "PTFTVD", startTime: "2017-09-06T00:00:00Z", endTime: "2017-09-06T05:30:00Z", startTimeLocal: "2017-09-06 10:00:00", endTimeLocal: "2017-09-06 15:30:00", product: { productCode: "PTFTVD", productType: "DAYTOUR", name: "01 Koala & River Cruise - Return cruise with Entry into Lone Pine", shortDescription: "The Koala and River Cruise is a memorable" } }, { id: 41498876, productCode: "PJIOQO", startTime: "2017-09-06T04:15:00Z", discount: { id: 7, title: "Discount Rulezzz" }, product: { productCode: "PJIOQO", productType: "CUSTOM", name: "1 Hour 15 Minute Segway Joy Ride Experience", shortDescription: "Tour Length 14km approx. " } }, { id: 41498757, productCode: "PJIOQO", startTime: "2017-09-07T04:15:00Z", product: { productCode: "PJIOQO", productType: "CUSTOM", name: "1 Hour 15 Minute Segway Joy Ride Experience", shortDescription: "Tour Length 14km approx. Almost non stop segway r…nd we custom make this tour to " } }, { id: 41498846, productCode: "PJIOQO", startTime: "2017-09-08T04:15:00Z", product: { productCode: "PJIOQO", productType: "CUSTOM", name: "1 Hour 15 Minute Segway Joy Ride Experience", shortDescription: "Tour Length 14km approx. Almost non stop segway r…nd we custom" } }, { id: 41498600, productCode: "PJIOQO", startTime: "2017-09-09T04:15:00Z", product: { productCode: "PJIOQO", productType: "CUSTOM", name: "1 Hour 15 Minute Segway Joy Ride Experience", shortDescription: "Tour Length 14km approx. Almost non stop segway r…nd we custom make this tour t" } }], 
 
    hash = Object.create(null), 
 
    products = []; 
 

 
activities.forEach(function (a) { 
 
    var temp = {}, 
 
     key = a.product.productCode; 
 
    if (!hash[key]) { 
 
     hash[key] = {}; 
 
     Object.keys(a.product).forEach(function (k) { 
 
      hash[key][k] = a.product[k]; 
 
     }); 
 
     products.push(hash[key]); 
 
     hash[key].activities = []; 
 
    } 
 
    Object.keys(a).forEach(function (k) { 
 
     if (k !== 'product') { 
 
      temp[k] = a[k]; 
 
     } 
 
    }); 
 
    hash[key].activities.push(temp); 
 
}); 
 

 
console.log(products);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

Cela fonctionne bien avec l'échantillon Les données. Cependant, je suis tombé sur une pierre d'achoppement plus tôt. Pour créer la liste des tableaux d'activités J'utilise this.Activities.push (session); où la session est une activité individuelle. Je dois faire ceci pendant que nous filtrons d'autres sessions Quand une exécution ci-dessus, la solution ci-dessus est vide. Est-ce que je pousse la session dans la mauvaise chose? – ChrisR

+0

avec les données, je ne peux que deviner, ce que vous voulez dire. Qu'est-ce que 'this.Activities' et qu'est-ce que' session'? –

+0

Nous faisons un appel d'API obtenir un tableau d'activités que nous appelons 'activityResults' Nous avons alors une logique qui boucle à travers les' activityResults' et appliquons notre propre logique et ceux qui répondent à nos conditions nous poussons vers les 'activités' Nous avons quelque chose dans le genre de 'activities = []; pour (var x = 0; x ChrisR

0

Si vous utilisez ES6, vous pouvez effectuer les opérations suivantes

.... 
//activities already defined 
let projectToActivityObject = {} 
activities.forEach((activity) => { 
    let productID = activity.product.productCode; 
    projectToActivityObject[productID] = projectToActivityObject.hasOwnProperty(productID) ? projectToActivityObject[productID] : new Set(); 
    projectToActivityObject[productID].add(activity); 
}); 
console.log(projectToActivityObject);