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])日期
:合并与行
键关联的数组日期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])
。您只检查第一个“行”元素,而您应该检查所有元素。