Найти симметричную разницу между двумя массивами
Я хотел бы найти симметричную разницу между двумя массивами. Эта реализация работает, однако я хотел бы написать функцию, специфичную только для двух массивов, а не функцию, которая находит симметричное различие между кучей массивов. Функция должна выглядеть так:
function diffArray(arr1, arr2) { }
затем верните новый массив с симметричной разностью.
Моя лучшая попытка была
var newArr = [];
for (var i = 0; i < arr1.length; i++){
var x = arr[i];
for (var n = 0; n < arr2.length; n++){
var y = arr2[n];
if (y === x){
break;
} else {
newArr.push(y);
}
}
}
Однако я знаю, что это даже не близко. Вопрос (это проблема алгоритма для FreeCodeCamp) указывает на использование в реализации методов array.filter(), array.indexOf(), array.concat(), array.slice(). Я понимаю, что общая идея состоит в том, чтобы взять каждый элемент в одном из массивов (первый в моем случае), а затем сравнить его с каждым элементом во втором массиве. Если совпадений не найдено, вставьте этот элемент в newArr.
Может ли кто-нибудь помочь с надежной реализацией, которая использует вышеупомянутые методы, и дать исчерпывающее объяснение / комментарии о том, как это работает?
Спасибо!
4 ответа
Вот еще одна идея:
function diffArray(arr1, arr2) {
var newArr = [];
return arr1.filter(function(val) {
return arr2.indexOf(val) === -1;
})
/*the method above, returns a new array, so you can chain it
to concat with the array returned from the filter() method
in the arr2...*/
.concat(arr2.filter(function(val) {
return arr1.indexOf(val) === -1;
}));
}
Это мое простое решение
function diffArray(a, b){
c = a.concat(b)
d = [];
var diffarr = c.filter(function(c1){
if (a.indexOf(c1) === -1 || b.indexOf(c1) === -1){
d.push(c1)
}
})
return d;}
diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]);
Хорошо. Я решил это, но я думаю, что все еще можно сделать лучше. Пожалуйста, не стесняйтесь комментировать и рассказывать мне, как улучшить мой алгоритм. На самом деле я настаиваю.
function diffArray(arr1, arr2) {
var newArray = [];
function inArray2(value){
if(arr2.indexOf(value) == -1){
return true;
}
return false;
}
function inArray1(value){
if(arr1.indexOf(value) == -1){
return true;
}
return false;
}
var arr1Filtered = arr1.filter(inArray2);
var arr2Filtered = arr2.filter(inArray1);
newArray = arr1Filtered.concat(arr2Filtered);
return newArray;
}
Так как это прошло все тестовые случаи, я предполагаю, что это правильно для всех случаев. Уф.
ОБНОВЛЕНИЕ: новый и улучшенный алгоритм, благодаря полезной информации от torazaburo. Надеюсь, что это поможет любому, кто также застрял на этом вызове.
function diffArray(arr1, arr2) {
var newArray = [];
function notInArray2(value){
return arr2.indexOf(value) === -1;
}
function notInArray1(value){
return arr1.indexOf(value) === -1;
}
var arr1Filtered = arr1.filter(notInArray2);
var arr2Filtered = arr2.filter(notInArray1);
newArray = arr1Filtered.concat(arr2Filtered);
return newArray;
}
Это можно решить, объединив несколько методов массива.
Ниже в решении используются concat, reduce и includes.
function arrayDifference(arr1, arr2) {
return arr1
.concat(arr2)
.filter(item => !arr1.includes(item) || !arr2.includes(item));
}
console.log(arrayDifference([1, 2, 5], [1, 2, 3, 4, 5, 4])) // [3, 4, 4]
console.log(arrayDifference([1, 2, 5, 4], [1, 2, 3, 4])) // [5, 3]