首页 > 解决方案 > 将两个时间线数组合并为一个

问题描述

嘿伙计们,我目前被困在一个问题上。

我必须合并到时间线。每个时间线都以对象数组的形式给出。目前我的想法是连接然后对两个输入进行排序。之后,比较开始时间和结束时间。有什么帮助吗?

原来的问题:

编写一个函数将两个数组时间线合并为一个。如果对象值不同,则新值应为 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)

标签: javascriptarrayssortingmergegreedy

解决方案


推荐阅读