200 lines
13 KiB
Markdown
200 lines
13 KiB
Markdown
![]() |
---
|
|||
|
title: Find the Symmetric Difference
|
|||
|
localeTitle: Найти симметричную разницу
|
|||
|
---
|
|||
|
 Не забудьте использовать [**`Read-Search-Ask`**](https://forum.freecodecamp.org/t/how-to-get-help-when-you-are-stuck/) если вы застряли. Попробуйте подключить программу  и напишите свой собственный код 
|
|||
|
|
|||
|
###  Проблема Объяснение:
|
|||
|
|
|||
|
Симметричная разность (обычно обозначаемая Δ) двух множеств - это набор элементов, которые находятся в любом из двух наборов, но не в обоих.
|
|||
|
|
|||
|
Например, `sym([1, 2, 3], [5, 2, 1, 4])` должен дать `[3, 4, 5]` .
|
|||
|
|
|||
|
Следующее выше определение, симметричная разность трех множеств _A_ , _B_ и _C_ может быть выражена как `(A Δ B) Δ C`
|
|||
|
|
|||
|
#### Связанные ссылки
|
|||
|
|
|||
|
* [Симметричная разница - Википедия](https://en.wikipedia.org/wiki/Symmetric_difference)
|
|||
|
* [Симметричная разница - YouTube](https://www.youtube.com/watch?v=PxffSUQRkG4)
|
|||
|
|
|||
|
[](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)
|
|||
|
|
|||
|
[##  Подсказка: 1
|
|||
|
|
|||
|
Объектом _arguments_ является объект типа _Array,_ который только наследует свойство `Array.length` . Поэтому рассмотрим преобразование его в реальный _массив_ .
|
|||
|
|
|||
|
> _попытаться решить проблему сейчас_
|
|||
|
|
|||
|
##  Подсказка: 2
|
|||
|
|
|||
|
Deem записывает вспомогательную функцию, которая возвращает симметричную разницу двух массивов на каждый вызов, а не пытается разделить все множества одновременно.
|
|||
|
|
|||
|
> _попытаться решить проблему сейчас_
|
|||
|
|
|||
|
##  Подсказка: 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}
|
|||
|
```
|
|||
|
|
|||
|
> _попытаться решить проблему сейчас_
|
|||
|
|
|||
|
## Осторожно, спойлеры!
|
|||
|
|
|||
|

|
|||
|
|
|||
|
**Решение впереди!**
|
|||
|
|
|||
|
##  Решение базового кода:
|
|||
|
|
|||
|
```javascript
|
|||
|
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)
|
|||
|
|
|||
|
[](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)
|
|||
|
|
|||
|
##  Решение промежуточного кода:
|
|||
|
|
|||
|
```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]);
|
|||
|
```
|
|||
|
|
|||
|
 [Код запуска](https://repl.it/CLoc/0)
|
|||
|
|
|||
|
### Код Объяснение:
|
|||
|
|
|||
|
* Метод `slice()` используется для разбиения объекта _аргументов_ на массив _args_ .
|
|||
|
* Функция `getDiff` находит симметричную разницу между двумя наборами, _arr1_ и _arr2_ . Он используется как функция обратного вызова для метода `reduce()` вызываемого в _args_ .
|
|||
|
* Первая `filterFunction()` возвращает элементы в _arr1,_ которые не существуют в _arr2_ .
|
|||
|
* Следующий `filterFunction()` запускается на каждом массиве против другого, чтобы проверить обратную `filterFunction()` первой проверки на уникальность и объединить ее.
|
|||
|
* _резюме_ состоит из приведенных аргументов.
|
|||
|
* `filter()` используется в _сводке_ для сохранения только уникальных значений и _уникальных_ значений.
|
|||
|
|
|||
|
#### Связанные ссылки
|
|||
|
|
|||
|
* [JavaScript Array.prototype.slice ()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice)
|
|||
|
* [JavaScript Array.prototype.filter ()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)
|
|||
|
* [JavaScript Array.prototype.concat ()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat)
|
|||
|
|
|||
|
##  Расширенное решение для кода:
|
|||
|
|
|||
|
```javascript
|
|||
|
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]);
|
|||
|
```
|
|||
|
|
|||
|
 [Код запуска](https://repl.it/@ashenm/Symmetric-Difference)
|
|||
|
|
|||
|
### Код Объяснение:
|
|||
|
|
|||
|
* Основная функция _sym ()_ создает массив из _аргументов_ и уменьшает его элементы, используя вспомогательную функцию _diffArray ()_ для одного массива.
|
|||
|
|
|||
|
* Функция _diffArray ()_ возвращает симметричную разность двух массивов путем выделения уникальных элементов в параметризованных массивах; _arr1_ и _arr2_ .
|
|||
|
|
|||
|
|
|||
|
#### Связанные ссылки
|
|||
|
|
|||
|
* [JavaScript Array.from ()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from)
|
|||
|
* [JavaScript Array.prototype.filter ()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)
|
|||
|
|
|||
|
##  ПРИМЕЧАНИЯ ДЛЯ ВЗНОСОВ:
|
|||
|
|
|||
|
*  **НЕ** добавляйте решения, похожие на любые существующие решения. Если вы считаете, что это **_похоже, но лучше_** , попробуйте объединить (или заменить) существующее подобное решение.
|
|||
|
* Добавьте объяснение своего решения.
|
|||
|
* Классифицируйте решение в одной из следующих категорий - **Basic** , **Intermediate** и **Advanced** . 
|
|||
|
* Пожалуйста, добавьте свое имя пользователя, только если вы добавили **соответствующее основное содержимое** . (  **_НЕ_** _удаляйте существующие имена пользователей_ )
|
|||
|
|
|||
|
> Видеть  [**`Wiki Challenge Solution Template`**](http://forum.freecodecamp.com/t/algorithm-article-template/14272) для [**`Wiki Challenge Solution Template`**](http://forum.freecodecamp.com/t/algorithm-article-template/14272) для справки.
|