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

1,00
р.
Симметрическая разность 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]