Files
2018-10-16 21:32:40 +05:30

13 KiB
Raw Blame History

title, localeTitle
title localeTitle
Find the Symmetric Difference Найти симметричную разницу

:triangular_flag_on_post: Не забудьте использовать Read-Search-Ask если вы застряли. Попробуйте подключить программу :busts_in_silhouette: и напишите свой собственный код :pencil:

:checkered_flag: Проблема Объяснение:

Симметричная разность (обычно обозначаемая Δ) двух множеств - это набор элементов, которые находятся в любом из двух наборов, но не в обоих.

Например, sym([1, 2, 3], [5, 2, 1, 4]) должен дать [3, 4, 5] .

Следующее выше определение, симметричная разность трех множеств A , B и C может быть выражена как (A Δ B) Δ C

Связанные ссылки

[## :speech_balloon: Подсказка: 1

Объектом arguments является объект типа Array, который только наследует свойство Array.length . Поэтому рассмотрим преобразование его в реальный массив .

попытаться решить проблему сейчас

:speech_balloon: Подсказка: 2

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

попытаться решить проблему сейчас

:speech_balloon: Подсказка: 3

Примените вспомогательную функцию к созданному массиву аргументов, который в свою очередь редуцирует их элементы, чтобы сформировать ожидаемый результат.

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

A = {1, 2, 3} 
 B = {2, 3, 4} 
 C = {3, 4, 5} 
 
 (A ⋂ B) ⋂ C = {1, 4} &Intersection {3, 4, 5} 
 A ⋂ B = {1, 3, 5} 

попытаться решить проблему сейчас

Осторожно, спойлеры!

:warning:

Решение впереди!

:beginner: Решение базового кода:

    function sym() { 
      var args = []; 
      for (var i = 0; i < arguments.length; i++) { 
        args.push(arguments[i]); 
      } 
 
      function symDiff(arrayOne, arrayTwo) { 
        var result = []; 
 
        arrayOne.forEach(function(item) { 
          if (arrayTwo.indexOf(item) < 0 && result.indexOf(item) < 0) { 
            result.push(item); 
          } 
        }); 
 
        arrayTwo.forEach(function(item) { 
          if (arrayOne.indexOf(item) < 0 && result.indexOf(item) < 0) { 
            result.push(item); 
          } 
        }); 
 
        return result; 
      } 
 
      // Apply reduce method to args array, using the symDiff function 
      return args.reduce(symDiff); 
    } 

```](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce) 

 [![:rocket:](https://forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=3 ": Ракета:")](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce) [Код запуска](https://repl.it/C4II/0)

### Код Объяснение:

*   `push()` используется для разбиения объекта _аргументов_ на массив, _args_ .
*   Функция `symDiff` находит симметричную разницу между двумя наборами. Он используется как функция обратного вызова для метода `reduce()` вызываемого в _args_ .
*   `arrayOne.forEach()` подталкивает элементы к _результату,_ которые присутствуют только в _arrayOne,_ а также не являются частью _результата_ .
*   `arrayTwo.forEach()` подталкивает элементы к _результату,_ которые присутствуют только в _arrayTwo,_ а также не являются частью _результата_ .
*   Возвращается _результат_ , являющийся симметричной разницей. Это решение работает для любого количества наборов.

#### Связанные ссылки

*   [JavaScript для](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/statements/for)
*   [JavaScript Array.length](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/length)
*   [JavaScript Array.prototype.push ()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push)
*   [JavaScript Array.prototype.forEach ()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)
*   [JavaScript Array.prototype.indexOf ()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)

## ![:sunflower:](https://forum.freecodecamp.com/images/emoji/emoji_one/sunflower.png?v=3 ": Подсолнечное:") Решение промежуточного кода:

```javascript
    function sym() { 
 
      // Convert the argument object into a proper array 
      var args = Array.prototype.slice.call(arguments); 
 
      // Return the symmetric difference of 2 arrays 
      var getDiff = function(arr1, arr2) { 
 
        // Returns items in arr1 that don't exist in arr2 
        function filterFunction(arr1, arr2) { 
          return arr1.filter(function(item) { 
            return arr2.indexOf(item) === -1; 
          }); 
        } 
 
        // Run filter function on each array against the other 
        return filterFunction(arr1, arr2) 
          .concat(filterFunction(arr2, arr1)); 
      }; 
 
      // Reduce all arguments getting the difference of them 
      var summary = args.reduce(getDiff, []); 
 
      // Run filter function to get the unique values 
      var unique = summary.filter(function(elem, index, self) { 
        return index === self.indexOf(elem); 
        }); 
      return unique; 
    } 
 
    // test here 
    sym([1, 2, 3], [5, 2, 1, 4]); 

:rocket: Код запуска

Код Объяснение:

  • Метод slice() используется для разбиения объекта аргументов на массив args .
  • Функция getDiff находит симметричную разницу между двумя наборами, arr1 и arr2 . Он используется как функция обратного вызова для метода reduce() вызываемого в args .
  • Первая filterFunction() возвращает элементы в arr1, которые не существуют в arr2 .
  • Следующий filterFunction() запускается на каждом массиве против другого, чтобы проверить обратную filterFunction() первой проверки на уникальность и объединить ее.
  • резюме состоит из приведенных аргументов.
  • filter() используется в сводке для сохранения только уникальных значений и уникальных значений.

Связанные ссылки

:rotating_light: Расширенное решение для кода:

    function sym() { 
      let argv = Array.from(arguments).reduce(diffArray); 
      return argv.filter((element, index, array) => index === array.indexOf(element));//remove duplicates 
    } 
 
    function diffArray(arr1, arr2) { 
      return arr1 
        .filter(element => !arr2.includes(element)) 
        .concat(arr2.filter(element => !arr1.includes(element))); 
    } 
 
    // test here 
    sym([1, 2, 3], [5, 2, 1, 4]); 

:rocket: Код запуска

Код Объяснение:

  • Основная функция sym () создает массив из аргументов и уменьшает его элементы, используя вспомогательную функцию diffArray () для одного массива.

  • Функция diffArray () возвращает симметричную разность двух массивов путем выделения уникальных элементов в параметризованных массивах; arr1 и arr2 .

Связанные ссылки

:clipboard: ПРИМЕЧАНИЯ ДЛЯ ВЗНОСОВ:

  • :warning: НЕ добавляйте решения, похожие на любые существующие решения. Если вы считаете, что это похоже, но лучше , попробуйте объединить (или заменить) существующее подобное решение.
  • Добавьте объяснение своего решения.
  • Классифицируйте решение в одной из следующих категорий - Basic , Intermediate и Advanced . :traffic_light:
  • Пожалуйста, добавьте свое имя пользователя, только если вы добавили соответствующее основное содержимое . ( :warning: НЕ удаляйте существующие имена пользователей )

Видеть :point_right: Wiki Challenge Solution Template для Wiki Challenge Solution Template для справки.