Javascript 使用最大值和计数将多个对象减少为一个

Javascript 使用最大值和计数将多个对象减少为一个,javascript,arrays,object,Javascript,Arrays,Object,我有这样一个对象数组: [ { name: "aaa", mainName: "bbb", occurrences: 3, collectTime: "15-OCT-2018 09:03:02", status: "unfinished" }, { name: "aaa",

我有这样一个对象数组:

    [
        {
            name: "aaa",
            mainName: "bbb",
            occurrences: 3,
            collectTime: "15-OCT-2018 09:03:02",
            status: "unfinished"
        },

        {
            name: "aaa",
            mainName: "bbb",
            occurrences: 2,
            collectTime: "14-OCT-2018 05:63:42",
            status: "unfinished"
        },

        {
            name: "aaa",
            mainName: "bbb",
            occurrences: 5,
            collectTime: "15-OCT-2018 10:56:35",
            status: "finished"
        },

        {
            name: "ccc",
            mainName: "ddd",
            occurrences: 7,
            collectTime: "11-OCT-2018 13:12:41",
            status: "finished"
        },

        {
            name: "ccc",
            mainName: "ddd",
            occurrences: 10,
            collectTime: "15-OCT-2018 09:03:02",
            status: "finished"
        },

        {
            name: "ccc",
            mainName: "ddd",
            occurrences: 4,
            collectTime: "15-OCT-2018 22:36:32",
            status: "unfinished"
        },
    ]
    [
        {
            name: "aaa",
            mainName: "bbb",
            occurrences: 5,  // highest occurrences value for the unique combination of name and mainName
            collectTime: "15-OCT-2018 10:56:35",  // collectTime corresponding to the highest occurrences
            finished: 1, // count of the status 
            unfinished: 2 // count of the status 
        },

        {
            name: "ccc",
            mainName: "ddd",
            occurrences: 10, // highest occurrences value for the unique combination of name and mainName
            collectTime: "15-OCT-2018 09:03:02",  // collectTime corresponding to the highest occurrences
            finished: 2, // count of the status 
            unfinished: 1 // count of the status 
        },

    ]
但是,我似乎无法获得如下所示的数组:

    [
        {
            name: "aaa",
            mainName: "bbb",
            occurrences: 3,
            collectTime: "15-OCT-2018 09:03:02",
            status: "unfinished"
        },

        {
            name: "aaa",
            mainName: "bbb",
            occurrences: 2,
            collectTime: "14-OCT-2018 05:63:42",
            status: "unfinished"
        },

        {
            name: "aaa",
            mainName: "bbb",
            occurrences: 5,
            collectTime: "15-OCT-2018 10:56:35",
            status: "finished"
        },

        {
            name: "ccc",
            mainName: "ddd",
            occurrences: 7,
            collectTime: "11-OCT-2018 13:12:41",
            status: "finished"
        },

        {
            name: "ccc",
            mainName: "ddd",
            occurrences: 10,
            collectTime: "15-OCT-2018 09:03:02",
            status: "finished"
        },

        {
            name: "ccc",
            mainName: "ddd",
            occurrences: 4,
            collectTime: "15-OCT-2018 22:36:32",
            status: "unfinished"
        },
    ]
    [
        {
            name: "aaa",
            mainName: "bbb",
            occurrences: 5,  // highest occurrences value for the unique combination of name and mainName
            collectTime: "15-OCT-2018 10:56:35",  // collectTime corresponding to the highest occurrences
            finished: 1, // count of the status 
            unfinished: 2 // count of the status 
        },

        {
            name: "ccc",
            mainName: "ddd",
            occurrences: 10, // highest occurrences value for the unique combination of name and mainName
            collectTime: "15-OCT-2018 09:03:02",  // collectTime corresponding to the highest occurrences
            finished: 2, // count of the status 
            unfinished: 1 // count of the status 
        },

    ]

我不知道如何准确地使用Array.prototype.reduce()来获得我所需要的。我已经取得了一些进展,但还不能得到确切的结果。非常感谢您的指导,谢谢

filter
将允许您检查输出集中是否已经存在
name
mainName
的组合。一旦确定了这一点,您可以在没有匹配该组合的内容存在时推入当前条目,或者根据出现次数是否更高来更新值

var输入=[
{
名称:“aaa”,
主要名称:“bbb”,
事件:3,
收集时间:“2018年10月15日09:03:02”,
状态:“未完成”
},
{
名称:“aaa”,
主要名称:“bbb”,
事件:2,
收集时间:“2018年10月14日05:63:42”,
状态:“未完成”
},
{
名称:“aaa”,
主要名称:“bbb”,
发生次数:5次,
收集时间:“2018年10月15日10:56:35”,
状态:“已完成”
},
{
名称:“ccc”,
主要名称:“ddd”,
事件:7,
收集时间:“2018年10月11日13:12:41”,
状态:“已完成”
},
{
名称:“ccc”,
主要名称:“ddd”,
发生次数:10次,
收集时间:“2018年10月15日09:03:02”,
状态:“已完成”
},
{
名称:“ccc”,
主要名称:“ddd”,
事件:4,
收集时间:“2018年10月15日22:36:32”,
状态:“未完成”
},
]
常量输出=输入。减少((arr,obj)=>{
让existing=arr.filter(t=>t.name==obj.name&&t.mainName==obj.mainName)[0]
如果(现有){
如果(对象引用>现有引用){
分配对象(现有,对象)
}
如果(现有[对象状态]){
现有[目标状态]+=1
}否则{
现有[对象状态]=1
}
删除现有的.status
}否则{
对象[对象状态]=1
删除对象状态
方位推力(obj)
}
返回arr
}, [])

log(输出)
很高兴展示您的努力,但这里仍然有一个可行的解决方案。希望这对您的下一个项目是一个有用的启发:

const arr=[
{
名称:“aaa”,
主要名称:“bbb”,
事件:3,
收集时间:“2018年10月15日09:03:02”,
状态:“未完成”
},
{
名称:“aaa”,
主要名称:“bbb”,
事件:2,
收集时间:“2018年10月14日05:63:42”,
状态:“未完成”
},
{
名称:“aaa”,
主要名称:“bbb”,
发生次数:5次,
收集时间:“2018年10月15日10:56:35”,
状态:“已完成”
},
{
名称:“ccc”,
主要名称:“ddd”,
事件:7,
收集时间:“2018年10月11日13:12:41”,
状态:“已完成”
},
{
名称:“ccc”,
主要名称:“ddd”,
发生次数:10次,
收集时间:“2018年10月15日09:03:02”,
状态:“已完成”
},
{
名称:“ccc”,
主要名称:“ddd”,
事件:4,
收集时间:“2018年10月15日22:36:32”,
状态:“未完成”
},
];
//缩小阵列
常数res=arr.reduce((当前,下一个)=>{
//检查累加器中是否存在下一项(当前)。
const needle=current.find(i=>i.name==next.name&&i.mainName==next.mainName);
//如果是的话。。。
如果(针){
//增加现有引用。
针点位置+=+下一个位置位置;
//根据下一个状态增加状态计数器。
指针[下一个状态]+=1;
//如果需要,请及时更换收集器。
next.collectTime=next.occurrences>next.highestOccurrences?next.collectTime:next.collectTime;
//跟踪到目前为止发现的最高事件。
next.highestOccurrences=next.occurrences>needle.highestOccurrences?next.occurrences:needle.highestOccurrences;
}
//否则。。
否则{
//创建一个“finished”属性,并将其设置为0。
next.finished=0;
//创建一个“未完成”属性,并将其设置为0。
next.unfinished=0;
//跟踪该项目的最高发生率。
next.highestOccurrences=next.occurrences;
//相应地增加该项目的状态。
下一步[下一步.状态]+=1;
//将此项目推到蓄能器上。
当前推送(下一步);
}
回流;
},[])。映射(功能(项){
//一旦完成,只需删除不需要/不需要的属性..注意:这是不必要的。
删除item.highestOccurrences;
删除项目状态;
退货项目;
});

控制台日志(res)如果找不到同名的新对象,可以通过获取新对象来减少数组,或者如果找到新对象,可以根据需要更新值

var数据=[{name:“aaa”,mainName:“bbb”,事件:3,collectTime:“15-OCT-2018 09:03:02”,状态:“unfinished”},{name:“aaa”,mainName:“bbb”,事件:2,collectTime:“14-OCT-2018 05:63:42”,状态:“unfinished”},{name:“aaa”,mainName:“bbb”,事件:5,collectTime:“15-OCT-2018 10:56:35”,状态:“finished”},{name:“ccc”,mainName:“ddd”,事件:7,collectTime:“2018年10月11日13:12:41”,状态:“完成”},{name:“ccc”,mainName:“ddd”,事件:10,collectTime:“2018年10月15日09:03:02”,状态:“完成”},{name:“ccc”,mainName:“ddd”,事件:4,collectTime:“2018年10月15日22:36:32”,状态:“未完成”},
结果=数据.reduce((r,{name,mainName,事件,collectTime,status})=>{
var temp=r.find((o)=>o.name==name);
如果(临时){
如果(事件>临时事件){
临时事件=事件;
temp.collectTime=collectTime;
}
const newArray = Object.values(result);