2017-09-05 14 views
1

データソースから以下のアクティビティの応答を受け取ります。これらは一意の開始時刻を持ち、同じ製品に属することができます。入れ子オブジェクト(JS)を使用して配列を並べ替える

現在、製品情報オブジェクトはアクティビティ内にネストされています。私は「再編成」して情報をグループ化するのに失敗しました。

私が必要とする構造は、製品内のオブジェクトに同じ製品コードのアクティビティを持つ製品(productCode)を持つことです。例えば、 。 "製品コード": "PTFTVD" "活動":[{アクティビティ1、アクティビティ2等}]

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

偉大を行うことができ、どのような動作しませんか?あなたのコードも追加してください。 –

+0

プロダクトコードのLodashで_.groupBy関数を使うことから始めましょう。これは、あなたが '{" PJIOQO ":[products]、...}のようなオブジェクトを提供します。 –

答えて

0

基本的にデータの切り替えは、2つの段階に分類される:

  1. グループの製品、
  2. 製品のアクティビティを収集します。

1の場合、オブジェクトやMapのような検索可能なデータ構造が必要です。そこにはキーとデータが収集されています。

ここでproductCodeをキーとして使用し、productのデータを新しい値として使用できます。アクティビティを収集するためのプロパティを追加します。

結果セットに配列を使用し、結果セットに新しい製品をプッシュします。ただし、オブジェクトにはまだキーにアクセスできます。

2.すべてのデータを収集し、アクティビティ配列に割り当てます。

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

サンプルでうまくいきますデータ。しかし、私は以前は不安に陥っていました。 私はthis.Activities.push(session)を使用しているアクティビティの配列のリストを作成します。 ここで、セッションは個々のアクティビティです。他のセッションを除外するときにこれを行う必要があります 上記を実行すると、上記の解決策は空です。私はセッションを間違ったことに押し込んでいますか?データと – ChrisR

+0

、私はあなたが何を意味するか、推測することができます。 'this.Activities'とは何ですか?' session'は何ですか? –

+0

私たちはAPI呼び出しを行い、「activityResults」と呼ばれるアクティビティの配列を取得します 次に、「activityResults」をループし、独自のロジックを適用するロジックと、「activities」にプッシュする条件を満たすロジックを適用します 私たちは行に沿って何かを持っています 'activities = []; for(var x = 0; x ChrisR

0

あなたはES6を使用している場合は、次の

.... 
//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); 
関連する問題