2017-09-05 8 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

큰, 무엇을 작동하지 않습니다 할 수 ES6를 사용하는 경우? 코드를 추가하십시오. –

+0

제품 코드의 Lodash에서 _.groupBy 함수를 사용하여 시작하면, 시작해야합니다.'{ "PJIOQO : [products], ...}와 같은 객체를 얻을 것입니다. –

답변

0

기본적 데이터의 전환이 두 단계로 분류된다 :

  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

당신은 당신은 다음

.... 
//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);