Проверьте перекрытие массива в JavaScript - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть несколько массивов, таких как [1,5], [3,6], [2,8],[19,13], [12,15]. Когда я пропущу два массива в выходных данных функции будет [1,6], [2,19],[12,15]

, я хочу удалить перекрывающиеся числа из 2 массивов. как на первом и втором массивах 5 и 3 будут перекрываться от 1 до 6.

Ответы [ 2 ]

2 голосов
/ 06 апреля 2020

Я считаю, что это то, что вы хотите (вы получаете минимум первого массива и максимум второго массива):

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]));
}

РЕДАКТИРОВАТЬ: ответ с несколькими параметрами, как вы просили в своем комментарии:

Мы могли бы использовать остальные параметры в ответе ниже, но я буду использовать arguments объект для совместимости с Inte rnet 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]));
1 голос
/ 06 апреля 2020

Это может быть легко выполнено, если я найду минимальное значение тока и максимальное значение следующего элемента.

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,[]);

...