Javascript 我有一个对象数组,如果其中一个键匹配,我想将它们组合成一个对象(不覆盖初始属性)
我有一个对象数组,如果其中一个键匹配(在本例中为“date”键),我希望将它们组合成一个对象 预期产出应为Javascript 我有一个对象数组,如果其中一个键匹配,我想将它们组合成一个对象(不覆盖初始属性),javascript,arrays,object,Javascript,Arrays,Object,我有一个对象数组,如果其中一个键匹配(在本例中为“date”键),我希望将它们组合成一个对象 预期产出应为 Array [ Object { "date": "2020-07-14", "finishTime": ["22:00", "12:00"] "startTime": ["13:30", "08:00"
Array [
Object {
"date": "2020-07-14",
"finishTime": ["22:00", "12:00"]
"startTime": ["13:30", "08:00"]
},
解决方案背后的逻辑:
//数据
常数数据=[
{
“日期”:“2020-07-14”,
“完成时间”:“22:00”,
“开始时间”:“13:30”,
},
{
“日期”:“2020-07-14”,
“完成时间”:“12:00”,
“开始时间”:“08:00”,
}
];
//新数据
const new_data=[];
data.forEach(元素=>{
const index=new_data.findIndex(el=>el.date==element.date);
如果(索引==-1){
//找不到
new_data.push({
“日期”:element.date,
“finishTime”:[element.finishTime],
“startTime”:[element.startTime],
});
}否则{
//发现
let found_元素=新_数据[索引];
已找到元素.finishTime.push(元素.finishTime);
找到\u element.startTime.push(element.startTime);
新的_数据[索引]=找到的_元素;
}
});
log(`newdata:${JSON.stringify(NEW_DATA)}`)
您可以编写一个通用的groupBy
函数,该函数将按字段组合对象。例如:
const数据=[
{
“日期”:“2020-07-14”,
“完成时间”:“22:00”,
“开始时间”:“13:30”,
},
{
“日期”:“2020-07-14”,
“完成时间”:“12:00”,
“开始时间”:“08:00”,
}
];
函数groupBy(数组、属性){
常数temp={};
for(数组的常量项){
const propValue=项目[属性];
如果(!temp.hasOwnProperty(propValue)){
温度[propValue]={
[属性]:属性值
};
}
for(对象项(项)的常量[键,值]){
如果(键===属性)继续;
temp[propValue][key]=(temp[propValue][key]| |[])。concat(value);
}
}
返回对象值(temp);
}
console.dir(groupBy(数据,'date'));
输出:
[
{
日期:“2020-07-14”,
完成时间:[“22:00”,“12:00”],
开始时间:[“13:30”,“08:00”],
}
]
我的示例使用
ES6
语法,如果需要,可以轻松地将此代码重新生成ES5
。此外,我的代码是以命令式风格编写的,如果需要,可以使用reduce
和forEach
重写它。是的,这是我从API得到的响应(一个字符串形式的键),但我需要通过比较两个日期字符串的('2020-07-14')都是一样的。这就是你要问的吗?你想按一个匹配字段还是按任何匹配字段对它们进行分组?如果在你的示例中,有另一个对象的日期
等于2020-06-07
,开始时间
是13:30
,会发生什么?这是一个好问题。这是在客户端上处理的,因此需要多个shi无法选择具有相同开始时间的fts。因此,不能有重复的日期开始。如果一个条目没有其他类似条目,该条目的值应保持为正常值,还是应将其转换为具有单个值的数组?
Array [
Object {
"date": "2020-07-14",
"finishTime": ["22:00", "12:00"]
"startTime": ["13:30", "08:00"]
},