Javascript 我有一个对象数组,如果其中一个键匹配,我想将它们组合成一个对象(不覆盖初始属性)

Javascript 我有一个对象数组,如果其中一个键匹配,我想将它们组合成一个对象(不覆盖初始属性),javascript,arrays,object,Javascript,Arrays,Object,我有一个对象数组,如果其中一个键匹配(在本例中为“date”键),我希望将它们组合成一个对象 预期产出应为 Array [ Object { "date": "2020-07-14", "finishTime": ["22:00", "12:00"] "startTime": ["13:30", "08:00"

我有一个对象数组,如果其中一个键匹配(在本例中为“date”键),我希望将它们组合成一个对象

预期产出应为

 Array [
  Object {
    "date": "2020-07-14",
    "finishTime": ["22:00", "12:00"]
    "startTime": ["13:30", "08:00"]
  },

解决方案背后的逻辑:

  • 创建一个新的空数组(称为Y),我们将在其中存储“紧凑”解决方案
  • 循环遍历原始数组的所有元素(称为X)
  • 检查当前元素(来自X)是否已在数组Y中(从Y中查找索引,以便可以更新元素)
  • 如果索引等于-1,则没有元素,因此我们将其添加到Y
  • 否则(元素已经存在于Y中)我们使用索引(大于-1)->更新(使用push)完成和开始时间->使用之前找到的索引将更新后的find\u元素重写为Y来检索元素
  • 以下是一个工作示例:

    //数据
    常数数据=[
    {
    “日期”:“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"]
      },