Невозможно правильно получить общие элементы между 4 массивами - PullRequest
2 голосов
/ 13 апреля 2019

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

Но похоже, что он учитывает любые элементы, которые являются общими даже для двух или трех массивов. Но мне нужно получить общий элемент, который повторяется во всех четырех массивах. Как я могу это исправить?

let newArr = [];

function common(arr1, arr2, arr3, arr4) {

  newArr = arr1.filter(function(v) {
    return arr2.indexOf(v) >= 0;
  })
  newArr.concat(arr2.filter(function(v) {
    return newArr.indexOf(v) >= 0;
  }));
  newArr.concat(arr3.filter(function(v) {
    return newArr.indexOf(v) >= 0;
  }));
  newArr.concat(arr4.filter(function(v) {
    return newArr.indexOf(v) >= 0;
  }));
}

common([1, 2, 6, 5, 9], [1, 2, 3, 6, 5, 9], [6, 5, 4, 5], [8, 2, 1, 6, 4]);

$('div').text(newArr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div></div>

Ответы [ 3 ]

2 голосов
/ 13 апреля 2019

Используйте некоторые filter вызовы с indexOf, например, так:

let newArr = [];

function common(arr1, arr2, arr3, arr4) {
  newArr = arr1.filter(function(e) {
    return arr2.indexOf(e) > -1 && arr3.indexOf(e) > -1 && arr4.indexOf(e) > -1;
  });
}

common([1, 2, 6, 5, 9], [1, 2, 3, 6, 5, 9], [6, 5, 4, 5], [8, 2, 1, 6, 4]);

$('div').text(newArr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div></div>
1 голос
/ 13 апреля 2019

Эта версия решения позволяет передавать неопределенное количество массивов.До тех пор, пока он не найдет массив, в котором нет номера, он будет включать число в результаты.

function common() {
  var firstArray = arguments[0];
  var otherArrays = Array.prototype.slice.call(arguments, 1);
  
  if (!otherArrays) return firstArray;
  
  return firstArray.filter(function(element){
    return otherArrays.filter(function(otherArray){
      return otherArray.indexOf(element) < 0;
    }).length == 0;
  });
}

var result = common([1, 2, 6, 5, 9], [1, 2, 3, 6, 5, 9], [6, 5, 4, 5], [8, 2, 1, 6, 4]);

$('div').text(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div></div>

Если вы знаете, что поддерживает браузер для Array.prototype.every, эта логика может быть несколько уменьшена.

function common() {
  var firstArray = arguments[0];
  var otherArrays = Array.prototype.slice.call(arguments, 1);
  
  if (!otherArrays) return firstArray;
  
  return firstArray.filter(function(element){
    return otherArrays.every(function(otherArray){
      return otherArray.indexOf(element) > -1;
    });
  });
}

var result = common([1, 2, 6, 5, 9], [1, 2, 3, 6, 5, 9], [6, 5, 4, 5], [8, 2, 1, 6, 4]);

$('div').text(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div></div>
1 голос
/ 13 апреля 2019

Вы можете просто использовать reduce() как сито для непрерывной фильтрации отфильтрованного результата при работе с includes()

let s = [[1, 2, 6, 5,9], [1, 2, 3, 6, 5,9], [ 6, 5, 4, 5], [8, 2, 1, 6, 4]];

let common = s.reduce((common, arr) => common.filter(item => arr.includes(item)))
console.log(common)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...