Is er een manier om het verschil tussen twee arrays terug te geven in JavaScript?
Bijvoorbeeld:
var a1 = ['a', 'b'];
var a2 = ['a', 'b', 'c', 'd'];
// need ["c", "d"]
Ik neem aan dat je een normale array vergelijkt. Zo niet, dan moet je de for lus veranderen in een for .. in lus.
function arr_diff (a1, a2) {
var a = [], diff = [];
for (var i = 0; i < a1.length; i++) {
a[a1[i]] = true;
}
for (var i = 0; i < a2.length; i++) {
if (a[a2[i]]) {
delete a[a2[i]];
} else {
a[a2[i]] = true;
}
}
for (var k in a) {
diff.push(k);
}
return diff;
}
console.log(arr_diff(['a', 'b'], ['a', 'b', 'c', 'd']));
console.log(arr_diff("abcd", "abcde"));
console.log(arr_diff("zxc", "zxc"));
Een betere oplossing, als je niet geeft om achterwaartse compatibiliteit, is het gebruik van filter. Maar toch, deze oplossing werkt.
Je zou in dit geval een Set kunnen gebruiken. Die is geoptimaliseerd voor dit soort bewerkingen (unie, intersectie, verschil).
Zorg ervoor dat het van toepassing is op uw geval, zodra het geen duplicaten toestaat.
var a = new JS.Set([1,2,3,4,5,6,7,8,9]);
var b = new JS.Set([2,4,6,8]);
a.difference(b)
// -> Set{1,3,5,7,9}
Gewoon denken... omwille van een uitdaging ;-) zou dit werken... (voor basisarrays van tekenreeksen, getallen, enz.) geen geneste arrays
function diffArrays(arr1, arr2, returnUnion){
var ret = [];
var test = {};
var bigArray, smallArray, key;
if(arr1.length >= arr2.length){
bigArray = arr1;
smallArray = arr2;
} else {
bigArray = arr2;
smallArray = arr1;
}
for(var i=0;i<bigArray.length;i++){
key = bigArray[i];
test[key] = true;
}
if(!returnUnion){
//diffing
for(var i=0;i<smallArray.length;i++){
key = smallArray[i];
if(!test[key]){
test[key] = null;
}
}
} else {
//union
for(var i=0;i<smallArray.length;i++){
key = smallArray[i];
if(!test[key]){
test[key] = true;
}
}
}
for(var i in test){
ret.push(i);
}
return ret;
}
array1 = "test1", "test2","test3", "test4", "test7"
array2 = "test1", "test2","test3","test4", "test5", "test6"
diffArray = diffArrays(array1, array2);
//returns ["test5","test6","test7"]
diffArray = diffArrays(array1, array2, true);
//returns ["test1", "test2","test3","test4", "test5", "test6","test7"]
Merk op dat de sortering waarschijnlijk niet zal zijn zoals hierboven vermeld... maar indien gewenst, roep .sort() aan op de array om het te sorteren.