比较对象数组元素的最佳方法

时间:2016-04-07 02:20:32

标签: javascript arrays logic

所以我有一个由一些具有StartTime和Duration成员变量的对象组成的数组。 startTime变量是格式为“14:20”的字符串,Duration变量是一个数字,表示分钟数。

你们可以推荐最佳逻辑来通过阵列和组合重叠元素。例如,如果数组有两个对象,第一个对象的startTime为“00:00”&持续时间为60,第二个对象的开始时间为“08:00”&持续时间为120,它们将作为单独的元素保留但是如果第二个对象的开始时间为“00:30”且持续时间为120,则两者将合并为一个对象,其startTime为“00:00”,并且持续时间为150.

我已经坚持了一段时间的一般逻辑,因为当组合两个块时,我无法弄清楚如何处理这种情况,但新的组合块会创建一个必须处理的新重叠。我只想到这个错误吗?!通常我对这种事情很好,但我在这里真的很挣扎。

2 个答案:

答案 0 :(得分:0)

扩展@gavgrif ...

我推荐这些内容。

  1. 从午夜(14:20 - > 188)开始,在几分钟内创建新的数组字段['start']
  2. 按“开始”字段排序数组
  3. 循环遍历数组,查找重叠项以合并为段。重叠的是这个新项目的开头不大于分段结束。
  4. php示例:

    $segment  = array('start' => -1, 'end' => -1);  // force new segment on init
    $segments = array();
    foreach ($items as $item) {
        if ($item['start'] > $segment['end']) {
    
            // add current segment (ignore initial fake segment) to segments
            if ($segment['start'] > -1) {
                // close out current segment
                $segments[] = $segment;                
            }
    
            // start new segment
            $segment = $item;
    
        } else {
    
            // increment segment end if its later than current segment end
            $segment['end'] = max($segment['end'], $item['end'];
        }        
    }
    
    // close out final segment
    $segments[] = $segment;
    

答案 1 :(得分:0)

我会通过创建两个树来实现这一点,一个由StartTime索引,另一个由EndTime索引(StartTime + Duration)。在两个树中搜索重叠的元素。一旦搜索完成,任何找到的元素都将从两个树中删除,并且单个新元素(StartTime = minStartTime(searchResult),EndTime = maxEndTime(searchResult))将被插入到两个树中。

使用一点额外的存储空间,但我相信这会使您的重叠问题变得微不足道。

(作为练习留下的树实现:)