数组遍历,获得最终覆盖值

 var arr = [{
        s: 8,
        e: 16
    }, {
        s: 17,
        e: 23.5
    }, {
        s: 7,
        e: 11
    }, {
        s: 23.5,
        e: 24
    }, {
        s: 23.5,
        e: 24
    },{
        s: 4,
        e: 5
    },{
        s: 3,
        e: 4.5
    }]
    

期望得到的结果为 arr=[{s:7,e:24},{3,5}],意思就是在0时到24时只要包含于或者有共同区间的合并为一个对象。

这是我写的代码。。。。。。写的特别乱,想用冒泡来试试。结果千奇百怪,要么e 或者 s为undefind,要么出来的结果重复不按想的来,弄了三个小时了。求好心人指点指点。

clipboard.png

阅读 2.1k
2 个回答
    var arr = [{
            s: 8,
            e: 16
        }, {
            s: 17,
            e: 23.5
        }, {
            s: 7,
            e: 11
        }, {
            s: 23.5,
            e: 24
        }, {
            s: 23.5,
            e: 24
        },{
            s: 4,
            e: 5
        },{
            s: 3,
            e: 4.5
        }];

    arr.sort(function(a,b){
        return a.s == b.s ? a.e - b.e : a.s - b.s
    });

    for(item of arr)console.log(item);
    
    
    var result = [];
    while(arr.length){
        var obj = arr[0];
        arr.splice(0,1);
        for(var i = 0 ; i < arr.length ; i ++){
            var cur = arr[i];
            
            if(cur.s > obj.e){
                result.push(obj);
                break;
            }else if(cur.e >= obj.e){
                obj.e = cur.e;
                arr.splice(i--,1);
            }else{
                arr.splice(i--,1);
            }                
        }
    }
    result.push(obj);
    console.log('============================')
    for(item of result)console.log(item)

没怎么测试过,思路应该差不多

function check(a, b) {
  return (a.s <= b.s && b.s <= a.e) || (a.s <= b.e && b.e <= a.e) || (a.s >= b.s && a.e <= b.e);
}

function combine(a, b) {
  return {
    s : Math.min(a.s, b.s),
    e : Math.max(a.e, b.e)
  };
}

function combineArray(arr) {
  var ret = [];
  var current = null, flag;

  while(arr.length > 0) {
    current = arr.shift();
    flag = false;

    for(var i = 0; i < arr.length; i++) {
      var temp = arr[i];
      if(check(current, temp)) {
        flag = true;
        arr.splice(i, 1);
        arr.unshift(combine(current, temp));
        break;
      }
    }

    if(!flag) {
      ret.push(current);
    }
  }

  return ret;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题