我有2组JSON数据,我需要合并-Merge productsbrands 与 production >使用JavaScript?
productbrands json数据:
const productBrands = {
"Brand A": {
"Brand D": {},
"Brand E": {}
},
"Brand B": {
"Brand F": {},
"Brand G": {}
}
};
产品JSON数据:
const products= [
{
"Brand A": {
"BrandName": "Brand A",
"HasChildBrands": {}
},
"Brand B": {
"BrandName": "Brand B",
"HasChildBrands": {}
},
"Brand C": {
"BrandName": "Brand C",
},
"Brand D": {
"BrandName": "Brand D",
},
"Brand E": {
"BrandName": "Brand E",
},
"Brand F": {
"BrandName": "Brand F",
},
"Brand G": {
"BrandName": "Brand G",
}
}
];
预期合并输出:
const products= [
{
"Brand A": {
"BrandName": "Brand A",
"HasChildBrands": {
"BrandName": "Brand D",
},
{
"BrandName": "Brand E",
}
},
"Brand B": {
"BrandName": "Brand B",
"HasChildBrands": {
"BrandName": "Brand F",
},
{
"BrandName": "Brand G",
}
},
"Brand C": {
"BrandName": "Brand C",
},
"Brand D": {
"BrandName": "Brand D",
},
"Brand E": {
"BrandName": "Brand E",
},
"Brand F": {
"BrandName": "Brand F",
},
"Brand G": {
"BrandName": "Brand G",
}
}
];
以下是我到目前为止尝试过的,但它仍然不是我所期望的:
let products = data.reduce(function (acc, obj) {
let item = Object.values(obj)[0]; //Get Indented Objects of Data
let BrandNames = item.BrandName; //Obtain "Brand A", "Brand B", "Brand C" ... so on.
let KeysForChildBrands = Object.keys(childBrands);
if($.inArray(BrandNames, KeysForChildBrands) != -1){ //Check if Brand Name existed in ProductBrands data
item['HasChildBrands'] = ProductBrands[BrandNames];
}
acc.push(obj);
return acc;
},[]);
console.log(JSON.stringify(products)); //Got stuck here.
我认为您应该更改products
的格式以简化您的计算,因为products
现在是对象的数组
我知道这不与您的输出对齐,因为在结果数组中,您有重复的BrandName
键,这不是正确的语法,以下是您应该维护数据的正确形式(至少在逻辑上是正确的,但MUGHT是正确的不高效(
var productBrands = {
"Brand A": {
"Brand D": {},
"Brand E": {}
},
"Brand B": {
"Brand F": {},
"Brand G": {}
}
};
var products= [
{
"BrandName": "Brand A",
"HasChildBrands": {}
},
{
"BrandName": "Brand B",
"HasChildBrands": {}
},
{
"BrandName": "Brand C",
"HasChildBrands": {}
},
{
"BrandName": "Brand D",
"HasChildBrands": {}
},
{
"BrandName": "Brand E",
"HasChildBrands": {}
}
];
for(obj in products)
{
products[obj].HasChildBrands = productBrands[products[obj].BrandName];
}
console.log(products);
只需将您的HasChildBrands
转换为数组
"Brand A": {
"BrandName": "Brand A",
"HasChildBrands": []
},
和数据到对象而不是数组
const data= {
"Brand A": {
"BrandName": "Brand A",
"HasChildBrands": []
},
"Brand B": {
"BrandName": "Brand B",
"HasChildBrands": []
},
"Brand C": {
"BrandName": "Brand C",
},
"Brand D": {
"BrandName": "Brand D",
},
"Brand E": {
"BrandName": "Brand E",
},
"Brand F": {
"BrandName": "Brand F",
},
"Brand G": {
"BrandName": "Brand G",
}
};
使用此代码合并对象
Object.keys(data).forEach(function(val){
if(childBrands[val]){
var childs = Object.keys(childBrands[val]);
childs.forEach(function(child){
data[val].HasChildBrands.push({'BrandName':child});
});
}
});
代码
const childBrands = {
"Brand A": {
"Brand D": {},
"Brand E": {}
},
"Brand B": {
"Brand F": {},
"Brand G": {}
}
};
const data= {
"Brand A": {
"BrandName": "Brand A",
"HasChildBrands": []
},
"Brand B": {
"BrandName": "Brand B",
"HasChildBrands": []
},
"Brand C": {
"BrandName": "Brand C",
},
"Brand D": {
"BrandName": "Brand D",
},
"Brand E": {
"BrandName": "Brand E",
},
"Brand F": {
"BrandName": "Brand F",
},
"Brand G": {
"BrandName": "Brand G",
}
};
Object.keys(data).forEach(function(val){
if(childBrands[val]){
var childs = Object.keys(childBrands[val]);
childs.forEach(function(child){
data[val].HasChildBrands.push({'BrandName':child});
});
}
});
console.log(data);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>