Javascript 将两个时间线数组合并为一个
嘿,伙计们,我现在被一个问题困住了 我必须和时间线合并。每个时间轴都以对象数组的形式给出。 目前,我的想法是先将两个输入进行合并,然后对它们进行排序。之后,比较开始和结束时间。有什么帮助吗 原问题: 编写一个函数将两条数组时间线合并为一条。如果对象值不同,则新值应为false 我创建此文档是为了更好地直观理解问题:Javascript 将两个时间线数组合并为一个,javascript,arrays,sorting,merge,greedy,Javascript,Arrays,Sorting,Merge,Greedy,嘿,伙计们,我现在被一个问题困住了 我必须和时间线合并。每个时间轴都以对象数组的形式给出。 目前,我的想法是先将两个输入进行合并,然后对它们进行排序。之后,比较开始和结束时间。有什么帮助吗 原问题: 编写一个函数将两条数组时间线合并为一条。如果对象值不同,则新值应为false 我创建此文档是为了更好地直观理解问题: Timeline1: // null 45 89 null // <----------
Timeline1:
// null 45 89 null
// <-----------||---------------------||----------------->
// true false true
Timeline2:
// null 67 null
// <-----------------------||---------------------------->
// true false
MergedTimeline:
// null 45 67 89 null
// <-----------||----------||---------||----------------->
// true false false false
以下是我目前的尝试:
const mergeTimeline = (arr1,arr2) =>{
let combine = arr1.concat(arr2)
let sortedTimeline= combine.sort((a,b)=>{
return a.start - b.start
})
const mergedTimeline = [sortedTimeline[0]];
for (let i = 1; i < sortedTimeline.length; i++) {
const currentTimeLine = sortedTimeline[I];
const lastMergedTime = mergedTimeline[mergedTimeline.length - 1]
if (lastMergedTime.value !== currentTimeLine.value) {
currentTimeLine.value = false
lastMergedTime.end = Math.max(lastMergedTime.end,currentTimeLine.start)
mergedTimeline.push(currentTimeLine)
} else{
mergedTimeline.push(currentTimeLine)
}
}
return mergedTimeline
}
mergeTimeline(timeline1,timeline2)
const mergeTimeline=(arr1,arr2)=>{
让联合收割机=arr1.concat(arr2)
让sortedTimeline=combine.sort((a,b)=>{
返回a.start-b.start
})
const mergedTimeline=[sortedTimeline[0]];
for(设i=1;i
原始输入总是按正确的顺序排列,就像两个时间线数组总是按正确的顺序排列一样,为什么我这么问是因为两条时间线都以空值开始和结束。@ZenWright没有说,但我假设它们是给你的,我猜我们也可以假设事件对象中的结束时间是多余的,对吗?(可从下一事件开始时间开始)。另外,你用贪婪的标签来标记这个问题——为什么不使用贪婪的方法呢?我想在这种情况下应该会更好…@DavidWinder我确实尝试了一种贪婪的方法,但我被卡住了,我把它作为标签留下了,因为我确实认为它可能能够以这种方式解决。你是对的,结束时间似乎是多余的
const mergeTimeline = (arr1,arr2) =>{
let combine = arr1.concat(arr2)
let sortedTimeline= combine.sort((a,b)=>{
return a.start - b.start
})
const mergedTimeline = [sortedTimeline[0]];
for (let i = 1; i < sortedTimeline.length; i++) {
const currentTimeLine = sortedTimeline[I];
const lastMergedTime = mergedTimeline[mergedTimeline.length - 1]
if (lastMergedTime.value !== currentTimeLine.value) {
currentTimeLine.value = false
lastMergedTime.end = Math.max(lastMergedTime.end,currentTimeLine.start)
mergedTimeline.push(currentTimeLine)
} else{
mergedTimeline.push(currentTimeLine)
}
}
return mergedTimeline
}
mergeTimeline(timeline1,timeline2)