检查 JavaScript 中的数组重叠

Check array overlapping in JavaScript

我有一些数组,例如 [1,5], [3,6], [2,8],[19,13], [12,15]。当我在函数输出中传递两个数组时,将是 [1,6], [2,19],[12,15]

我想从 2 个数组中删除重叠的数字。就像拳头和第二个数组一样,5 和 3 将在 1 到 6 之间重叠。

我相信这就是你想要的(你得到第一个数组的最小值和第二个数组的最大值):

function removeOverlap(arr1, arr2) {
  if (arr1 === undefined) {
    return arr2;
  }
  
  if (arr2 === undefined) {
    return arr1;
  }
  
  return [Math.min.apply(null, arr1), Math.max.apply(null, arr2)];
}

// Sample:
var myArrays = [[1,5], [3,6], [2,8], [19,13], [12,15]];

for (var i = 0; i < myArrays.length; i = i + 2) {
  console.log(removeOverlap(myArrays[i], myArrays[i + 1]));
}

编辑:按照您在评论中的要求使用多个参数进行回答:

我们可以使用 rest parameters in the answer below, but I will use the arguments object 来与 Internet Explorer 兼容。如果这不是必需的,您可以调整解决方案以使用第一个。

function removeOverlap(arr1, arr2) {
  // Converting the arguments object to array:
  var argsArray = Array.prototype.slice.call(arguments);

  // Removing undefined:
  argsArray = argsArray.filter(function(el) {
    return el != undefined;
  });

  // Alternative (not compatible with Internet Explorer):
  //argsArray = argsArray.filter(el => el);
  
  // We're looking for the min and max numbers, let's merge the arrays
  // e.g. transform [[1, 5], [3, 6], [2, 8]] into [1, 5, 3, 6, 2, 8] 
  var merged = [].concat.apply([], argsArray);

  // Alternative, but it is not compatible with Internet Explorer:
  //var merged = Array.flat(argsArray);
  
  return [Math.min.apply(null, merged), Math.max.apply(null, merged)];
}

// Sample:
var myArrays = [[1,5], [3,6], [2,8], [19,13], [12,15]];

for (var i = 0; i < myArrays.length; i = i + 2) {
  console.log(removeOverlap(myArrays[i], myArrays[i + 1]));
}

console.log(removeOverlap(myArrays[0], myArrays[1], myArrays[2]));

我可以很容易地找到当前项的最小值和下一项的最大值。

let initial  = [ [1, 5], [3, 6], [2, 8], [19, 13], [12, 15] ]
let expected = [ [1, 6], [2, 19], [12, 15] ]
let actual   = calculateOverlaps(initial);

console.log(JSON.stringify(actual) === JSON.stringify(expected)); // true

function calculateOverlaps(arr) {
  let result = [];
  for (let i = 0; i < arr.length; i+=2) {
    if (i >= arr.length - 1) {
      result.push(arr[i]); // If the array has an odd size, get last item
    } else {
      let curr = arr[i];
      let next = arr[i + 1];
      result.push([ Math.min(...curr), Math.max(...next) ]);
    }
  }
  return result;
}

这是一个更面向代码的函数:

const calculateOverlaps1 = (arr) => arr.reduce((r, e, i, a) =>
  (i % 2 === 0)
    ? r.concat([
        (i < a.length - 1)
          ? [ Math.min(...e), Math.max(...a[i+1]) ]
          : e
      ])
    : r, []);

甚至更小,只有 101 个字节。

f=a=>a.reduce((r,e,i)=>i%2===0?r.concat([i<a.length-1?[Math.min(...e),Math.max(...a[i+1])]:e]):r,[]);