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