Симметрическая разность 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]
Комментариев нет:
Отправить комментарий