Функция для получения элементов пересечения любого заданного числа массивов, содержащих строки - PullRequest
2 голосов
/ 08 июля 2019

У меня есть следующие функции, которые возвращают пересечение элементов между некоторыми массивами строк.

Изначально предполагалось, что он будет обрабатывать только 2 массива, но я начал нуждаться в том, чтобы он обрабатывал более 2 массивов.поэтому я добавил условное return, чтобы сделать его рекурсивным.

Как я могу сделать его достаточно гибким, чтобы он мог обрабатывать любое количество массивов (конечно, равное или больше 2).

Я хотя бы об использовании ...rest параметров, но пока не знаю, как это сделать.

function intersection(list1, list2, list3, list4) {
  const result = [];

  for (let i = 0; i < list1.length; i++) {
      let item1 = list1[i];
      let found = false;
      for (var j = 0; j < list2.length && !found; j++) {
          found = item1 === list2[j];
      }
      if (found === true) {
          result.push(item1);
      }
  }
  if (list3 && list4) {
    return intersection(result,list3,list4);
  }
  if (list3) {
    return intersection(result,list3);
  }
  return result;
}

SNIPPET

function intersection(list1, list2, list3, list4) {
  const result = [];

  for (let i = 0; i < list1.length; i++) {
      let item1 = list1[i];
      let found = false;
      for (var j = 0; j < list2.length && !found; j++) {
          found = item1 === list2[j];
      }
      if (found === true) {
          result.push(item1);
      }
  }
  if (list3 && list4) {
    return intersection(result,list3,list4);
  }
  if (list3) {
    return intersection(result,list3);
  }
  return result;
}

const x1 = ['a','b','c','d','e'];
const x2 = ['a','b','c','d'];
const x3 = ['a','b','c'];
const x4 = ['a','b'];

console.log('Intersection(x1,x2,x3,x4): ' + JSON.stringify(intersection(x1,x2,x3,x4)));
console.log('Intersection(x1,x2,x3): ' + JSON.stringify(intersection(x1,x2,x3)));
console.log('Intersection(x1,x2): ' + JSON.stringify(intersection(x1,x2)));

Ответы [ 3 ]

3 голосов
/ 08 июля 2019

Нет необходимости в рекурсии, вы можете взять остальные параметры ... и получить пересечение a Set и отфильтровать его.

function intersection(...arrays) {
    return arrays.reduce((a, b) => a.filter(Set.prototype.has, new Set(b)));
}

console.log(intersection(['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd'], ['a', 'b', 'c'], ['a', 'b']));
console.log(intersection(['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd'], ['a', 'b', 'c']));
console.log(intersection(['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd']));

Версия с рекурсией

function intersection(a, b = [], ...arrays) {
    var i = a.filter(Set.prototype.has, new Set(b));
    return arrays.length
         ? intersection(i, ...arrays)
         : i;
}

console.log(intersection(['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd'], ['a', 'b', 'c'], ['a', 'b']));
console.log(intersection(['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd'], ['a', 'b', 'c']));
console.log(intersection(['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd']));
1 голос
/ 08 июля 2019

Ответ Нины, конечно, больше, но я также пишу, чтобы предложить решение, основанное на вашем собственном коде.


Поскольку вашей функции нужно как минимум два списка, укажите их в списке аргументов. Затем используйте деструктурирование для факультативных.

Затем, если существует хотя бы один факультативный список, повторно выполните свою функцию, указав второй параметр в качестве первого факультативного. Используйте Array#shift, чтобы удалить его из списка. Не забудьте поставить свой новый факультативный список.

function intersection(list1, list2, ...lists) {
  const result = [];

  for (let i = 0; i < list1.length; i++) {
      let item1 = list1[i];
      let found = false;
      for (var j = 0; j < list2.length && !found; j++) {
          found = item1 === list2[j];
      }
      if (found === true) {
          result.push(item1);
      }
  }
  
  if (lists.length) {
    return intersection(result, lists.shift(), ...lists);
  }
  
  return result;
}

const x1 = ['a','b','c','d','e'];
const x2 = ['a','b','c','d'];
const x3 = ['a','b','c'];
const x4 = ['a','b'];

console.log('Intersection(x1,x2,x3,x4): ' + JSON.stringify(intersection(x1,x2,x3,x4)));
console.log('Intersection(x1,x2,x3): ' + JSON.stringify(intersection(x1,x2,x3)));
console.log('Intersection(x1,x2): ' + JSON.stringify(intersection(x1,x2)));
0 голосов
/ 08 июля 2019

Вы можете создать другую функцию, которая сравнивает два массива и возвращает пересечение. В функции intersection получите массивы, переданные в виде двумерного массива с именем lists, используя Параметры отдыха . Используйте reduce для пересечения массивов с compare в качестве обратного вызова

function compare(list1, list2) {
  const result = [];

  for (let i = 0; i < list1.length; i++) {
      let item1 = list1[i];
      let found = false;
      for (var j = 0; j < list2.length && !found; j++) {
          found = item1 === list2[j];
      }
      if (found === true) {
          result.push(item1);
      }
  }

  return result
}

function intersection(...lists) {
  return lists.reduce(compare)
}

const x1 = ['a','b','c','d','e'];
const x2 = ['a','b','c','d'];
const x3 = ['a','b','c'];
const x4 = ['a','b'];

console.log('Intersection(x1,x2,x3,x4): ' + JSON.stringify(intersection(x1,x2,x3,x4)));
console.log('Intersection(x1,x2,x3): ' + JSON.stringify(intersection(x1,x2,x3)));
console.log('Intersection(x1,x2): ' + JSON.stringify(intersection(x1,x2)));

Примечание: Возможно, вы можете упростить реализацию compare. Это просто для демонстрации вашего существующего кода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...