фильтрация 2 массивов для уникальных элементов - PullRequest
1 голос
/ 23 сентября 2019

Я пишу функцию, которая получает 2 массива и возвращает массив, элементы которого существуют в обоих массивах.Например, если я прохожу [6,7,8,9] и [1,8,2,6], он должен возвращать [6,8].

Моя цель - не использовать здесь циклы.

Я использую этот код:

const uniqueElements= (arr1, arr2) => {
return arr1.filter(it1=> arr2.filter((it2) => it2===it1).length>0)
}

Однако, если в массивах есть повторяющиеся элементы (например, [6,7,8,9,6] и [1,8,2,6,6]), он возвращает [6, 8, 6].

Как мне исправить мой код, чтобы он возвращал только уникальные элементы без дубликатов?Возможно ли это без использования петель?

Ответы [ 4 ]

0 голосов
/ 23 сентября 2019

Просто вы можете просто использовать Array#some() метод , чтобы записать условие внутри вашего Array#filter() метода обратного вызова:

const uniqueElements = (arr1, arr2) => {
  let viewed = [];
  return arr1.filter(it1 => {
    let found = arr2.some((it2) => it2 === it1) && viewed.indexOf(it1) == -1;
    viewed.push(it1);
    return found;
  });
}

Примечание:

Это не требует дубликатов, с использованием массива viewed и условия viewed.indexOf(it1) == -1.

Демо:

const uniqueElements = (arr1, arr2) => {
  let viewed = [];
  return arr1.filter(it1 => {
    let found = arr2.some((it2) => it2 === it1) && viewed.indexOf(it1) == -1;
    viewed.push(it1);
    return found;
  });
}

let a1 = [6,7,8,9,6];
let a2 = [1,8,2,6,6];

console.log(uniqueElements(a1, a2));
0 голосов
/ 23 сентября 2019

Решение с использованием Set от https://2ality.com/2015/01/es6-set-operations.html:

const uniqueElements = (arr1, arr2) => {
    const a = new Set(arr1);
    const b = new Set(arr2);
    const intersection = new Set(
        [...a].filter(x => b.has(x)));
    return Array.from(intersection);
}
0 голосов
/ 23 сентября 2019

Если вы просто хотите получить уникальное значение, которое появляется в обоих массивах, вы просто сначала изменяете оба массива на Set, перебираете один Set и проверяете, присутствует ли он в другом или нет, если он присутствует, возвращает true изфильтр иначе возвращает false,

const uniqueElements= (arr1, arr2) => {
  let set1 = new Set(arr1)
  let set2 = new Set(arr2)
  return [...set1].filter(it1=> set2.has(it1))
}

console.log(uniqueElements([6,7,8,9],[1,8,2,6]))
console.log(uniqueElements([6,7,8,9,6],[1,8,2,6,6]))

См., Чтобы прочитать о Набор Set MDN

0 голосов
/ 23 сентября 2019

Для вашего сценария используйте это -

constant uniqueElements= (arr1, arr2) => {
return Array.from(new Set(arr1.filter(it1=> arr2.filter((it2) => it2===it1).length>0)))
}

Надеюсь, это поможет

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