13 KiB
title, localeTitle
title | localeTitle |
---|---|
Find the Symmetric Difference | Найти симметричную разницу |
Не забудьте использовать
Read-Search-Ask
если вы застряли. Попробуйте подключить программу и напишите свой собственный код
Проблема Объяснение:
Симметричная разность (обычно обозначаемая Δ) двух множеств - это набор элементов, которые находятся в любом из двух наборов, но не в обоих.
Например, sym([1, 2, 3], [5, 2, 1, 4])
должен дать [3, 4, 5]
.
Следующее выше определение, симметричная разность трех множеств A , B и C может быть выражена как (A Δ B) Δ C
Связанные ссылки
Объектом 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}
попытаться решить проблему сейчас
Осторожно, спойлеры!
Решение впереди!
Решение базового кода:
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]);
Код Объяснение:
- Метод
slice()
используется для разбиения объекта аргументов на массив args . - Функция
getDiff
находит симметричную разницу между двумя наборами, arr1 и arr2 . Он используется как функция обратного вызова для методаreduce()
вызываемого в args . - Первая
filterFunction()
возвращает элементы в arr1, которые не существуют в arr2 . - Следующий
filterFunction()
запускается на каждом массиве против другого, чтобы проверить обратнуюfilterFunction()
первой проверки на уникальность и объединить ее. - резюме состоит из приведенных аргументов.
filter()
используется в сводке для сохранения только уникальных значений и уникальных значений.
Связанные ссылки
- JavaScript Array.prototype.slice ()
- JavaScript Array.prototype.filter ()
- JavaScript Array.prototype.concat ()
Расширенное решение для кода:
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]);
Код Объяснение:
-
Основная функция sym () создает массив из аргументов и уменьшает его элементы, используя вспомогательную функцию diffArray () для одного массива.
-
Функция diffArray () возвращает симметричную разность двух массивов путем выделения уникальных элементов в параметризованных массивах; arr1 и arr2 .
Связанные ссылки
ПРИМЕЧАНИЯ ДЛЯ ВЗНОСОВ:
НЕ добавляйте решения, похожие на любые существующие решения. Если вы считаете, что это похоже, но лучше , попробуйте объединить (или заменить) существующее подобное решение.
- Добавьте объяснение своего решения.
- Классифицируйте решение в одной из следующих категорий - Basic , Intermediate и Advanced .
- Пожалуйста, добавьте свое имя пользователя, только если вы добавили соответствующее основное содержимое . (
НЕ удаляйте существующие имена пользователей )
Видеть
![]()
Wiki Challenge Solution Template
дляWiki Challenge Solution Template
для справки.