Javascript 如何编写一个函数,用数组从多个对象创建一个对象

Javascript 如何编写一个函数,用数组从多个对象创建一个对象,javascript,arrays,object,Javascript,Arrays,Object,下午好,我遇到了困难。我面临一个我无法解决的问题。我有一个对象数组: [ { date: "2020-04-20", groups: ["apple"], type: ["fruit"], }, { date: "2020-04-20", groups: ["potate"], type: ["vegetable"], }, { date: "2

下午好,我遇到了困难。我面临一个我无法解决的问题。我有一个对象数组:

[
    {
        date: "2020-04-20",
        groups: ["apple"],
        type: ["fruit"],
    },
    {
        date: "2020-04-20",
        groups: ["potate"],
        type: ["vegetable"],
    },
    {
        date: "2020-04-23",
        groups: ["burger"],
        type: ["fastfood"],
    },
    {
        date: "2020-04-24",
        groups: ["cola"],
        type: ["water"],
    }
]
我需要编写一个函数,它将确定按日期将两个对象合并为一个对象。 也就是说,函数将返回的预期结果应如下所示:

[
    {
        date: "2020-04-20",
        groups: ["apple", "potate"],
        type: ["fruit", "vegetable"],
    },
    {
        date: "2020-04-23",
        groups: ["burger"],
        type: ["fastfood"],
    },
    {
        date: "2020-04-24",
        groups: ["cola"],
        type: ["water"],
    }
]

提前感谢您的帮助Array.prototype.reduce

从概念上讲,我建议在日期和整个对象之间创建一个映射。这将帮助您确定条目是否已存在。然后,可以在迭代时将相关键推送到相关数组。最后,您可以使用
Object.values
仅获取所创建地图的值

这是我经常使用的一种情景模式

我会做如下的事情:

const输入=[
{
日期:“2020-04-20”,
组:[“苹果”],
类型:[“水果”],
},
{
日期:“2020-04-20”,
组:[“potate”],
类型:[“蔬菜”],
},
{
日期:“2020-04-23”,
组别:[“汉堡”],
类型:[“快餐”],
},
{
日期:“2020-04-24”,
团体:[“可乐”],
类型:[“水”],
}
];
const combine=(arr)=>{
const dateMap=arr.reduce((附件,项目)=>{
如果(!附件[项目日期]){
acc[项目日期]=项目;
}否则{
acc[item.date]。组=[…acc[item.date]。组,…item.groups];
acc[item.date]。类型=[…acc[item.date]。类型,…item.type];
}
返回acc;
}, {});
返回Object.values(日期映射);
};

console.log(合并(输入))您可以使用标准分组和对象来收集值

var数据=[{date:“2020-04-20”,group:[“apple”],type:[“fruit”]},{date:“2020-04-20”,group:[“potate”],type:[“plate”],{date:“2020-04-23”,group:[“burger”],type:[“fastfood”]},{date date:“2020-04-24”,group:[“cola”],type:[“water”],
结果=对象值(数据减少((r,o)=>{
r[o.date]=r[o.date]|{date:o.date,组:[],类型:[];
r[o.date].groups.push(…o.groups);
r[o.date].type.push(…o.type);
返回r;
}, {}));
控制台日志(结果)

。作为控制台包装{max height:100%!important;top:0;}
您也可以使用
forEach
解决此问题。尝试一下:

var sortedData=[];
var数据=[{日期:“2020-04-20”,分组:[苹果],类型:[“水果”]},{日期:“2020-04-20”,分组:[“土豆”],类型:[“蔬菜”]},{日期:“2020-04-23”,分组:[“汉堡”],类型:[“快餐”]},{日期:“2020-04-24”,分组:[“可乐”],类型:[“水”};
data.forEach((元素、索引、arr)=>{
isDatePresent=sortedData.some((值)=>value.date==elem.date);
如果(!isDatePresent){
分类数据推送(elem);
}否则{
var index=sortedData.findIndex((值)=>value.date==elem.date);
sortedData[index].groups=[…sortedData[index].groups,…elem.groups];
sortedData[index]。类型=[…sortedData[index]。类型,…元素组];
}
});

console.log(sortedData)
向我们展示您的尝试,以便我们可以帮助您修复代码。只有代码没有帮助。如果您可以写一些解释,那么您的代码在库中所做的事情就更容易理解了,请看这里:这绝对是一个公平的批评。我确实想帮助人们成为更好的程序员。我只是补充了一个解释。