【问题标题】:Overlapping of numbers within an object对象内的数字重叠
【发布时间】:2011-11-03 08:47:16
【问题描述】:
var items = [
    {"id": 1, "begin":10, "end":30},
    {"id": 2, "begin":20, "end":40},
    {"id": 3, "begin":30, "end":50},
    {"id": 4, "begin":40, "end":60},
    {"id": 5, "begin":50, "end":70},
    {"id": 6, "begin":100, "end":170},
    {"id": 7, "begin":120, "end":180}
];

for (var i = 0; i < items.length; i++) {
    var currBegin = items[i].begin;
    var currEnd   = items[i].end;
    var out = [];
    for (var j = 0; j < items.length; j++) {
        var innerBegin = items[j].begin;
        var innerEnd = items[j].end;
        if (innerBegin < currBegin && innerEnd < currEnd && innerEnd >= currBegin)
          out.push(items[j].id);
    }
    console.log(out)           
}

我正在尝试根据初始数字和结束数字检查数字是否相互重叠。 到目前为止,我的代码给出了错误的输出:http://jsfiddle.net/bZzSV/

[]
[1]
[1, 2]
[2, 3]
[3, 4]
[]
[6]

基本上检查一个元素是否与另一个重叠。 1,2 重叠,但 1,3 不重叠,但 2,3 确实……最后,由于这些链接,1-5 重叠。

我想输出:

[1, 2, 3, 4, 5]
[6, 7]

感谢任何帮助!

【问题讨论】:

  • 简化你的逻辑。你真的需要 2 个 for 循环还是检查相邻元素就足够了?
  • 我听不懂你的问题,不明白你想做什么?
  • @Matt Ball:一个循环会更好,但还不知道怎么做。
  • @Fatih:基本上检查一个元素是否与另一个重叠。 1-2 重叠,但 1-3 不重叠,但 2-3 确实...最后,1-5 是这些链接的重叠原因。

标签: javascript arrays


【解决方案1】:

如果您不关心破坏原始 items 对象,您可以使用这些更改

while (items.length > 0) {
    var curr = items.shift();
    var currBegin = curr.begin;
    var currEnd   = curr.end;
    var out = [curr.id], j = 0;
    while (j < items.length) {
        var innerBegin = items[j].begin;
        var innerEnd = items[j].end;
        if (innerBegin <= currBegin && innerEnd >= currBegin || innerEnd >= currEnd && innerBegin <= currEnd) {
          out.push(items[j].id);
          currBegin = Math.min(currBegin, innerBegin);
          currEnd = Math.max(currEnd, innerEnd);
          items.splice(j, 1);
        } else {
          j++;
        }
    }
    console.log(out)           
}

但它依赖于几个前提,例如重叠间隔是相邻的。

  1. 您的代码中的主要问题是您在添加时没有更新 currBegin currEnd 间隔的边界。

  2. 其他问题是检测重叠区间。

  3. 最后一个问题是不记得哪些项目已经放入了某个输出数组(这里通过简单地删除项目来解决这个问题,这可能并不理想,但如果需要,可以以其他方式完成)。

【讨论】:

    猜你喜欢
    • 2021-05-10
    • 1970-01-01
    • 2018-02-12
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多