Страницы

Поиск по вопросам

четверг, 4 октября 2018 г.

Симметрическая разность

Симметрическая разность wiki Нужно найти симметрическую разность массивов. Написал функцию сравнения двух массивов, в которой объединяю массивы в один и в цикле ищу повторяющиеся значения. При нахождении удаляю.
function sym() { var args = Array.prototype.slice.call(arguments); var result = compareTwoArray(arguments[0], arguments[1]); if (arguments.length > 2) { for (var i = 2; i < arguments.length; i++) { // console.log('result = ' + result); result = compareTwoArray(result, arguments[i]); } } return result; } function compareTwoArray() { var args = Array.prototype.slice.call(arguments); var result = []; var newArr = args.reduce(function(prev, curr) { return prev.concat(curr); }) for (var i = 0; i < newArr.length; i++) { var count = 0; for (var j = i+1; j < newArr.length; j++) { if (newArr[i] === newArr[j]) { count += 1; newArr.splice(j, 1); j -= 1; } } if (count === 0) { result.push(newArr[i]); } } return result; } console.log(sym([1, 2, 3], [3, 1, 5])); // [2, 5] console.log(sym([1, 1, 3], [4, 6])); // [1, 3, 4, 6] console.log(sym([1, 1, 2, 5], [2, 2, 3, 5])); // [1, 3] console.log(sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5])); // [1, 4, 5] console.log(sym([1, 2, 5], [2, 3, 5], [3, 4, 5])); // [1, 4, 5]
Не знаю, как обрабатывать повторяющиеся значения. В одном случае его нужно удалить.
[1, 2, 3] [3, 1, 5] [2, 5] - должен получиться [2, 5] - получается с моим кодом
В другом оставить.
[1, 1, 3] [4, 6] [1, 3, 4, 6] - должен получиться [3, 4, 6] - получается с моим кодом
В другом и оставить(1) и удалить(2).
[1, 1, 2, 5] [2, 2, 3, 5] [1, 3] - должен получиться [3] - получается с моим кодом


Ответ

Решение для двух массивов. Хотя 3 и больше массивов можно обрабатывать ступенчато: сначала два первых, потом результат первой обработки и 3 массив и так далее.
function sum(arr1, arr2) { var tmp = arr1.concat(arr2), result = [], value, sum; for (var i = 0; i < tmp.length; i++) { var value = tmp[i]; if (result.indexOf(value) == -1) { sum = 0; if (arr1.indexOf(value) != -1) { sum++; } if (arr2.indexOf(value) != -1) { sum++; } if (sum == 1) { result.push(value); } } } return result; } console.log(sum([1, 2, 3], [3, 1, 5])); // [2, 5] console.log(sum([1, 1, 3], [4, 6])); // [1, 3, 4, 6] console.log(sum([1, 1, 2, 5], [2, 2, 3, 5])); // [1, 3]

Комментариев нет:

Отправить комментарий