Вложенные циклы javascript

Рейтинг: -2Ответов: 2Опубликовано: 18.01.2023

помогите разобраться. Не соображу даже как правильно написать условия?

Реализуйте и экспортируйте по умолчанию функцию, принимающую на вход два массива и возвращающую количество общих уникальных значений в обоих массивах. Для получения массива без повторяющихся элементов, используйте uniq из библиотеки lodash.
В целях обучения и прокачки, решите это упражнение с помощью вложенных циклов.

Ответы

▲ 2Принят

"В целях обучения и прокачки, решите это упражнение с помощью вложенных циклов" - если бы не эта фраза я прошёл бы мимо :) Я, в целях прокачки, сказал бы решить задачу без вложенных циклов, т.к. с вложенными циклами (по-моему) очевидно

Могу предложить 2 способа решить это:

  1. С помощью набора и счётчика:

    1. Создаём набор из уникальных элементов первого массива. Это позволяет нам не тратя время на поиски элемента и сразу узнать находится ли там искомый элемент или нет

    2. Если находится, то увеличиваем счётчик на 1 и в конце его возвращаем

    const nums1 = [1, 2, 3, 2, 4, 5, 6, 2];
    const nums2 = [4, 6, 3, 2, 7, 4, 6, 1, 8];
    
    function countUniqElements(arr1, arr2) {
      let count = 0;
      const arr1UniqSet = new Set(_.uniq(arr1));
      const arr2Uniq = _.uniq(arr2);
    
      for (const el of arr2Uniq) {
        if (arr1UniqSet.has(el)) ++count;
      }
    
      return count;
    }
    
    console.log(countUniqElements(nums1, nums2));
    <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>

1.1. Однострочный вариант первого способа (reduce)

const nums1 = [1, 2, 3, 2, 4, 5, 6, 2];
const nums2 = [4, 6, 3, 2, 7, 4, 6, 1, 8];

function countUniqElements(arr1, arr2) {
  return _.uniq(arr2)
          .reduce(
            (data, el) => (data.count += data.arr1UniqSet.has(el), data),
            {arr1UniqSet: new Set(_.uniq(arr1)), count: 0}
          ).count;
}

console.log(countUniqElements(nums1, nums2));
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>

  1. Создаём набора и метода filter

    1. Создаём набор из уникальных элементов первого массива

    2. Во втором массиве оставляем только те элементы, которые находятся в наборе

    const nums1 = [1, 2, 3, 2, 4, 5, 6, 2];
    const nums2 = [4, 6, 3, 2, 7, 4, 6, 1, 8];
    
    
    function countUniqElements(arr1, arr2) {
      const arr1UniqSet = new Set(_.uniq(arr1));
      const arr2Uniq = _.uniq(arr2);
      const uniqueInBothArr = arr2Uniq.filter(el => arr1UniqSet.has(el));
    
      return uniqueInBothArr.length;
    }
    
    console.log(countUniqElements(nums1, nums2));
    <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>

2.1. Почти однострочный вариант второго способа

const nums1 = [1, 2, 3, 2, 4, 5, 6, 2];
const nums2 = [4, 6, 3, 2, 7, 4, 6, 1, 8];

function countUniqElements(arr1, arr2) {
  const arr1UniqSet = new Set(_.uniq(arr1));

  return _.uniq(arr2).filter(el => arr1UniqSet.has(el)).length;
}

console.log(countUniqElements(nums1, nums2));
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>

▲ 0

Примерно как-то так можно решить данную задачу:

const arr1 = [1, 2, 3, 2, 4, 5, 6, 2];
const arr2 = [4, 6, 3, 2, 7, 4, 6, 1, 8];


function countUniqElements(arr1, arr2) {

  let count = 0;
  let temp1 = _.uniq(arr1);
  let temp2 = _.uniq(arr2);

  for (let i of temp1) {
    for (let j of temp2) {
      if (i === j) ++count;
    }
  }

  return count;
}

console.log(countUniqElements(arr1, arr2));


// export default countUniqElements;
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>