2017-02-27 43 views
1

我解决这个问题:合并对象,并返回冷凝范围对象

写功能mergeRanges(),它满足时间 范围的阵列,并返回冷凝范围(1 = 30分钟的阵列)

Input: 
[ 
    {startTime: 0, endTime: 1}, // meeting from 10:00 – 10:30 am (1 = 30 minutes) 
    {startTime: 3, endTime: 5}, // meeting from 12:00 – 1:30 pm 
    {startTime: 4, endTime: 8}, 
    {startTime: 10, endTime: 12}, 
    {startTime: 9, endTime: 10}, 
] 

Expected Output: 

[ 
    {startTime: 0, endTime: 1}, 
    {startTime: 3, endTime: 8}, 
    {startTime: 9, endTime: 12}, 
] 

我的解决办法是/如下:

var arr = [ 
    {startTime: 0, endTime: 1}, 
    {startTime: 3, endTime: 5}, 
    {startTime: 4, endTime: 8}, 
    {startTime: 10, endTime: 12}, 
    {startTime: 9, endTime: 10}, 
]; 

function result(arr){ 
    var finalResult = {}; 

    var c = arr.sort(function(a,b){ //First Sort 
    return a.startTime - b.startTime; 
    }); 

    var d = c.reduce(function(a,b){ 

    //Logic 

    //check to see if start time lies between a[start] < b[startTime] < a[end] 

    // If the startTime lies between a[startTime] to b[endTime] -> Merge them. 

// if(a[startTime]< b[startTime] < b[endTime]){ //if start time lies between start and end. 
    // a[endTime] = b[endTime]; 
    // delete b; 
    // } 

    }); 

} 

result(arr); 

我无法理解如何使用reduce函数来交换逻辑。有人能够启发我吗?

+0

什么叫 “交换逻辑” 是什么意思? –

回答

1

您可以使用reduce()和一个变量来存储endTime。

var input = [ 
 
    {startTime: 0, endTime: 1}, 
 
    {startTime: 3, endTime: 5}, 
 
    {startTime: 4, endTime: 8}, 
 
    {startTime: 10, endTime: 12}, 
 
    {startTime: 9, endTime: 10}, 
 
] 
 

 
var c = 0; 
 
var result = input.reduce(function(r, e, i) { 
 
    //Check if c < startTime of current object in loop or if its first 
 
    //element and if it is add it to r 
 
    if (c < e.startTime || i == 0) { 
 
    r.push(e) 
 
    } else { 
 
    //if not check if endTime of current object is > c 
 
    //(so you don't have problem at last object where endTime is smaller then some previous endTime) and change it 
 
    //in r of last element that you added 
 
    if (e.endTime > c) r[r.length - 1].endTime = e.endTime 
 
    } 
 
    //Always set c to current endTime 
 
    c = e.endTime 
 
    return r 
 
}, []) 
 

 
console.log(result)

+0

r,e和i是什么? (我是一个索引吗?)为什么你把“C”标记为0?你能解释一下你的逻辑吗?我很困惑你的解决方案。 (对不起,这个减少函数是最新的..最近开始学习)@Nenad Vracar – TechnoCorner

+0

好'r'是累加器或者在这种情况下它的数组,'e'是循环中的当前对象,'i'是你需要的索引只是为了检查它的第一个元素是否可以添加到数组中。 –