将两个时间轴合并为一个

时间:2018-07-10 02:25:16

标签: javascript arrays sorting merge greedy

嗨,我目前遇到了一个问题。

我必须合并到时间表。每个时间轴都以对象数组的形式给出。 目前,我的思维过程是合并然后对两个输入进行排序。之后,比较开始时间和结束时间。有帮助吗?

原始问题:

编写一个函数,将两个数组时间轴合并为一个。如果对象值不同,则新值应为false。

我创建此视频的目的是更好地理解这个问题:

Timeline1:


// null        45                     89                null
// <-----------||---------------------||----------------->
//       true             false                true


Timeline2:
// null                    67                           null
// <-----------------------||---------------------------->
//               true                     false


 MergedTimeline:             
// null        45          67         89                null
// <-----------||----------||---------||----------------->
//       true        false     false       false

示例输入:

let timeline1 = [
  { start: null, end: 45, value: true }, 
  { start: 45, end: 89, value: false }, 
  { start: 89, end: null, value: false }
]

let timeline2 = [
  { start: null, end: 67, value: true }, 
  { start: 67, end: null, value: false }
]


//expected output
return [
  { start: null, end: 45, value: true },
  { start: 45, end: 67, value: false },
  { start: 67, end: 89, value: false },
  { start: 89, end: null, value: 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)

0 个答案:

没有答案