Javascript 在数组中查找具有相同日期和总和值的元素

Javascript 在数组中查找具有相同日期和总和值的元素,javascript,arrays,Javascript,Arrays,我有一个带有示例值的对象数组 [ {name:"Name1",date:"2018-08-01", optimalValue:"33", realValue:"55"}, {name:"Name2",date:"2018-08-03", optimalValue:"17", realValue:"23"}, {name:"Name3",date:"2018-08-01", optimalValue:"23", realValue:"12"}, {name:"Nam

我有一个带有示例值的对象数组

[
    {name:"Name1",date:"2018-08-01", optimalValue:"33", realValue:"55"},
    {name:"Name2",date:"2018-08-03", optimalValue:"17", realValue:"23"},
    {name:"Name3",date:"2018-08-01", optimalValue:"23", realValue:"12"},
    {name:"Name4",date:"2018-08-04", optimalValue:"12", realValue:"11"},
]
我想在此数组元素中查找
optimizevalue
realValue
中具有相同日期和总和值的元素,并具有类似的数组,如下所示:

[
    {date:"2018-08-01", optimalValue:"56", realValue:"77"},
    {date:"2018-08-03", optimalValue:"17", realValue:"23"},
    {date:"2018-08-04", optimalValue:"12", realValue:"11"},
]

只需使用哈希表查找/分组重复项:

const hash = {}, result = [];

for(const { date, name, optimalValue, realValue } of input) {
  if(!hash[date]) 
      result.push(hash[date] = { date, name, optimalValue: 0, realValue: 0 });
  hash[date].realValue +=+ realValue;
  hash[date].optimalValue +=+ optimalValue;
}

您可以使用函数
reduce
对值进行分组和求和,并使用函数
Object.values
提取所需数组

let array=[{name:“Name1”,日期:“2018-08-01”,最优值:“33”,realValue:“55”},{name:“Name2”,日期:“2018-08-03”,最优值:“17”,realValue:“23”},{name:“Name3”,日期:“2018-08-01”,最优值:“23”,realValue:“12”},{name:“Name4”,日期:“2018-08-04”,最优值:“12”,realValue:“11”},
结果=Object.values(array.reduce((a,{name,date,optimalValue,realValue})=>{
a[date]=(a[date]|{date,最优值:0,真实值:0});
a[date].realValue=String(数字(a[date].realValue)+Number(realValue));
a[date].optimalValue=字符串(数字(a[date].optimalValue)+数字(optimalValue));
返回a;
}, {}));
控制台日志(结果)

。作为控制台包装{max height:100%!important;top:0;}
您可以使用
Array.reduce()
。由于需要将
optimalValue
realValue
作为字符串类型,因此可以使用
parseInt()
对值求和后将其转换为字符串:

var-arr=[
{名称:“名称1”,日期:“2018-08-01”,最优值:“33”,真实值:“55”},
{名称:“名称2”,日期:“2018-08-03”,最优值:“17”,真实值:“23”},
{名称:“名称3”,日期:“2018-08-01”,最优值:“23”,真实值:“12”},
{名称:“名称4”,日期:“2018-08-04”,最优值:“12”,真实值:“11”},
];
var res=arr.reduce((acc,obj)=>{
var existObj=acc.find(item=>item.date==obj.date);
if(existObj){
existObj.realValue=(parseInt(existObj.realValue)+parseInt(obj.realValue)).toString();
existObj.optimalValue=(parseInt(existObj.optimalValue)+parseInt(obj.optimalValue)).toString();
返回acc;
}
加速推力(obj);
返回acc;
},[]);

控制台日志(res)realValue:“77”
?因为55+12=77同一日期的和值55+12不是77…@很抱歉:)67
optimizevalue
realValue
是OP@ankitAgarwal但它应该是一个数字。“它是一根弦是没有意义的。”乔纳斯说。你应该根据OP展示的内容来回答。还有,为什么它没有意义?OP可能要求将其作为输入数组中的字符串。请参见输入数组不包含字符串value@JonasW. 您是对的,但是,OP可能需要这些值作为字符串。这是一个映射,您也可以使用内置映射。@sandro当然可以,但这里没有区别。在哈希表中,您只保存条目,没有与它们关联的值。