将多个Array与基于键的子数组合并

时间:2017-04-25 22:36:57

标签: javascript arrays

我首先用一个例子来解释我想要实现的目标。 我将有一个名为“Code'作为合并参数。

示例:

var Items = [{'Item_Id':1,'Item_Name':'Soap','Code':001},[{'Item_Id':2,'Item_Name':'Powder','Code':002]

var ItemPrice = [{'ItemPrice_Id':1,'ItemPrice_ItemId':1,'Price':'10$','Code':001},[{'ItemPrice_Id':2,'ItemPrice_ItemId':2,'Price':'20$','Code':002]

var ItemFeatures = [{'FeatureId':2,'FeatureName':'Cool','Code':001},{'FeatureId':3,'FeatureName':'Nice','Code':001},
[{'FeatureId':4,'FeatureName':'Pretty','Code',002},{'FeatureId':5,'FeatureName':'Beautiful','Code':002}

];

现在我只考虑3个阵列,但总共有9个阵列。 我的结果数组应该将元素与键组合为Code。 在这里,如果您看到ItemFeatures有2个具有类似代码001和002的元素,那么它将被转换为子数组。

所以结果应该如下所示。

[{'Item_Id':1,'Item_Name':'Soap','ItemPrice_Id':1,'ItemPrice_ItemId':1,'Price':'10$','ItemFeatures': [{'FeatureId':2,'FeatureName':'Cool'},{'FeatureId':3,'FeatureName':'Nice'}]
},
{'Item_Id':2,'Item_Name':'Powder','ItemPrice_Id':2,'ItemPrice_ItemId':2,'Price':'20$','ItemFeatures': [{'FeatureId':4,'FeatureName':'Pretty'},{'FeatureId':5,'FeatureName':'Beautiful'}]
}];

];

在示例中,ItemFeatures被转换为子数组,因为它具有多个具有相同代码的项目。 我将有两个阵列,它们将有多个具有相同代码的项目。 在结果数组中ItemFeatures子数组的方式,我也需要其他子数组。

我该怎么做?能帮到我解决这个问题吗? 是JS的新手,有点卡住了。

1 个答案:

答案 0 :(得分:0)

您可以结合使用Array.mapArray.findArray.filterObject.assign来查找匹配的对象,并将它们合并为一个:

var Items = [{'Item_Id':1,'Item_Name':'Soap','Code':001}, {'Item_Id':2,'Item_Name':'Powder','Code':002}]
var ItemPrice = [{'ItemPrice_Id':1,'ItemPrice_ItemId':1,'Price':'10$','Code':001}, {'ItemPrice_Id':2,'ItemPrice_ItemId':2,'Price':'20$','Code':002}];
var ItemFeatures = [{'FeatureId':2,'FeatureName':'Cool','Code':001},{'FeatureId':3,'FeatureName':'Nice','Code':001}, {'FeatureId':4,'FeatureName':'Pretty','Code': 002}, {'FeatureId':5,'FeatureName':'Beautiful','Code':002}];

// convert Items into another array of objects
const merged = Items.map((item) => {
  // add all of the matching ItemPrice properties to Item
  return Object.assign(item, ItemPrice.find(iprice => iprice.Code === item.Code), {
    // add a key "ItemFeatures" with matching ItemFeatures
    ItemFeatures: ItemFeatures.filter(feature => feature.Code === item.Code)
  });
});

console.log(merged);