2017-09-05 70 views
1

我收到来自数据源的以下活动响应。这些具有独特的开始时间,并且可以属于同一产品。使用嵌套对象(JS)重新排列数组

当前产品信息对象嵌套在活动中。我试图“重新安排”并对信息进行分组,尝试失败。

我需要的结构是在产品中的对象中包含具有相同产品代码的活动的产品(productCode)。 例如。 “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

基本上数据的切换在两个阶段中进行分组:

  1. 集团的产品,
  2. 收集产品的活动。

对于1,您需要一个可搜索的数据结构,如对象或Map,您需要收集密钥和数据。

在这里,您可以使用productCode作为关键字,并将product的数据作为新值。然后添加一个用于收集活动的属性。

对结果集使用数组并将新产品推送到结果集,同时产品仍可通过对象中的键访问。

现在转到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" } }], 
 
    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 = []; (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);