Javascript 基于自定义逻辑减少对象数组

Javascript 基于自定义逻辑减少对象数组,javascript,lodash,reduce,overlap,Javascript,Lodash,Reduce,Overlap,我试图通过基于逻辑合并对象之间的键来减少对象数组 解释 我想按键减少以下数组(见下文): 行:合并它们之间共同的数字范围(例如:[1,2]+[3,2]=[1,2,3]) 日期:合并与行键关联的数组日期 应删除所有复制阵列和/或密钥 示例: 输入示例A: const错误=[ { “行”:[1,2], “日期”:[“2020-12-12”、“2020-12-19”]、[“2020-12-13”、“2020-12-25”] }, { “行”:[1,3], “日期”:[“2020-12-12”、“202

我试图通过基于逻辑合并对象之间的键来减少对象数组

解释

我想按键减少以下数组(见下文):

  • :合并它们之间共同的数字范围(例如:[1,2]+[3,2]=[1,2,3])
  • 日期
    :合并与
    键关联的数组日期
  • 应删除所有复制阵列和/或密钥

    示例:

    输入示例A

    const错误=[
    {
    “行”:[1,2],
    “日期”:[“2020-12-12”、“2020-12-19”]、[“2020-12-13”、“2020-12-25”]
    },
    {
    “行”:[1,3],
    “日期”:[“2020-12-12”、“2020-12-19”]、[“2020-12-15”、“2020-12-17”]
    },
    {
    “行”:[2,3],
    “日期”:[“2020-12-13”、“2020-12-25”、“2020-12-15”、“2020-12-17”]
    },
    {
    “行”:[3,2],
    “日期”:[“2020-12-15”、“2020-12-17”]、[“2020-12-13”、“2020-12-25”]
    }
    ]
    
    输出示例A

    预期常数=[{
    行:[1,2,3],
    日期:[
    ["2020-12-12", "2020-12-19"],
    ["2020-12-13", "2020-12-25"],
    ["2020-12-05", "2020-12-20"],
    ["2020-12-15", "2020-12-17"]
    ]
    }];
    

    输入示例B

    const错误=[
    {
    行:[1,2],
    日期:[“2020-12-12”,“2020-12-19”,“2020-12-04”,“2020-12-25”]
    },
    {
    行:[1,5],
    日期:[“2020-12-12”,“2020-12-19”,“2020-12-05”,“2020-12-20”]
    },
    {
    行:[2,5],
    日期:[“2020-12-04”,“2020-12-25”,“2020-12-05”,“2020-12-20”]
    },
    {
    行:[3,4],
    日期:[“2020-10-19”、“2020-10-25”、“2020-10-24”、“2020-10-27”]
    },
    {
    行:[4,3],
    日期:[“2020-10-24”,“2020-10-27”,“2020-10-19”,“2020-10-25”]
    },
    {
    行:[5,2],
    日期:[“2020-12-05”、“2020-12-20”、“2020-12-04”、“2020-12-25”]
    }
    ];
    
    输出示例B

    预期常数=[
    {
    行:[1,2,5],
    日期:[
    ["2020-12-12", "2020-12-19"],
    ["2020-12-04", "2020-12-25"],
    ["2020-12-05", "2020-12-20"]
    ]
    },
    {
    行:[3,4],
    日期:[
    ["2020-10-19", "2020-10-25"],
    ["2020-10-24", "2020-10-27"]
    ]
    }
    ];
    
    我创建了一个沙箱来实现这一点:

    有三个例子,第三个不起作用

    我目前的执行情况:

    const sanatizeErrors=errors.reduce((acc,currentError,i)=>{
    const nextorror=错误[i+1]
    const hasOnlySingleError=errors.length==1
    //以下常量不够“强”,不能处理所有情况
    const与NEXTLINE有共同错误=
    nextError&&&.includes(nextError.lines,currentError.lines[0])
    如果(只有一个错误){
    返回[{
    lines:currentError.lines,
    日期:currentError.dates
    }]
    }
    如果(具有下一行的CommonError){
    返回[
    …acc,
    {
    行:uq.uniq([
    …currentError.lines,
    …下一行
    ]),
    日期:uqwith(
    [
    …currentError.dates,
    …日期
    ],u.isEqual)
    }
    ]
    }
    返回acc
    }, [])
    
    此最终数组用于处理动态日期范围重叠。


    只要条件非常复杂,数据结构也很复杂,代码就非常混乱,任何突出的地方都会出现。我很乐意检查其他想法。我在代码段中添加了注释来解释逻辑。如果你有任何问题,欢迎你

    const错误=[
    {
    行:[1,2],
    日期:[“2020-12-12”,“2020-12-19”,“2020-12-04”,“2020-12-25”]
    },
    {
    行:[1,5],
    日期:[“2020-12-12”,“2020-12-19”,“2020-12-05”,“2020-12-20”]
    },
    {
    行:[2,5],
    日期:[“2020-12-04”,“2020-12-25”,“2020-12-05”,“2020-12-20”]
    },
    {
    行:[3,4],
    日期:[“2020-10-19”、“2020-10-25”、“2020-10-24”、“2020-10-27”]
    },
    {
    行:[4,3],
    日期:[“2020-10-24”,“2020-10-27”,“2020-10-19”,“2020-10-25”]
    },
    {
    行:[5,2],
    日期:[“2020-12-05”、“2020-12-20”、“2020-12-04”、“2020-12-25”]
    }
    ];
    让输出=错误。减少((acc,rec)=>{
    让我;
    //迭代累加器的元素以检查合并的位置
    对于(i=0;irec.lines.indexOf(it)>-1).some(it=>it))
    {
    //合并并合并(删除重复项)行数组
    acc[i].lines=(acc[i].lines.concat(rec.lines)).filter((it,i,arr)=>arr.indexOf(it)==i)
    //合并并合并(删除重复项)日期数组。在筛选复杂项中,检查以查找元素的最新位置。比较数组时,IndexOf不起作用(与行一样)
    acc[i].dates=(acc[i].dates.concat(rec.dates)).filter((it,i,arr)=>{
    const lastPosition=arr.reduce((acc,rec,idx)=>rec[0]==it[0]&&rec[1]==it[1]?idx:acc,0)
    返回i==lastPosition
    })
    //如果找到合并位置-完成
    返回acc
    }  
    }
    //如果没有合并位置-添加新组
    返回[…acc,rec]
    },[])
    
    console.log('result',输出)您在哪一步遇到问题?@SlavaKnyazev您可以在这里看到输出数组包含两个实体,而预期的是一个(例如C)。我想我的逻辑组合“普通”数字不够“灵活”。也请把你的代码贴出来。感谢您的帮助我敢打赌这一行是错误的:
    \uu.includes(nextorror.lines,currentError.lines[0])
    。您只检查第一个“行”元素,而您应该检查所有元素。