JSON-如何使用javaScript delde()使用密钥合并2个数据集



我有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>

最新更新