2016-04-14 9 views
0

Ich habe diesen Codepegel http://codepen.io/PiotrBerebecki/pen/ZWxvzm erstellt, wenn ich versuche, ein Array zu finden, das symmetrische Differenz von zwei oder mehr Arrays enthält.Ist es möglich, meine symmetrische Differenzfunktion geringfügig zu ändern, so dass sie eine unbekannte Anzahl von Argumenten akzeptieren kann?

Meine Funktion funktioniert OK, aber nur wenn vier Argumente übergeben werden. Wie kann ich meine Funktion so ändern, dass sie eine unbekannte Anzahl von Argumenten akzeptiert? Es gibt einen potenziell wiederholbaren Codeblock, der vielleicht Teil einer for Schleife oder reduce/map Methoden sein könnte. Ich kann nicht herausfinden, wie ich das erreichen kann.

symmetricDifference([1,2,3,4], [3,4,5,6], [2,4,6,7], [8,9]) 
// should return an array containing [1,4,5,7,8,9] 

symmetricDifference([1,2,3,4], [3,4,5,6]) 
// should return an array containing [1,2,5,6] 

var arrA = [1,2,3,4]; 
var arrB = [3,4,5,6]; 
var arrC = [2,4,6,7]; 
var arrD = [8,9]; 

function symmetricDifference(arr) { 
    let args = Array.prototype.slice.call(arguments); 
    let result = []; 

    result = args[0].concat(args[1]).filter(function(item) { 
    return args[0].indexOf(item) === -1 || args[1].indexOf(item) === -1; 
    }); 

    result = result.concat(args[2]).filter(function(item) { 
    return result.indexOf(item) === -1 || args[2].indexOf(item) === -1; 
    }); 

    result = result.concat(args[3]).filter(function(item) { 
    return result.indexOf(item) === -1 || args[3].indexOf(item) === -1; 
    }); 

    return result; 
} 
+1

Ja, verwenden Sie eine einfache 'for' Schleife über' args'. Bitte zeigen Sie uns Ihren Versuch, wenn Sie nicht erfolgreich waren. – Bergi

+1

Hinweis: Beginnen Sie mit 'var result = args [0];' – Bergi

+1

Ist es immer in Vierergruppen? Gruppieren Sie Ihre Argumente in Vierergruppen und wiederholen Sie diese Gruppen, indem Sie jedes der vier Elemente in der Gruppe wie in Ihrem Beispiel auswählen. – ste2425

Antwort

1

Dank der Hinweise durch @Bergi habe ich eingeführt, um eine for Schleife und einen Anfangswert var result = args[0]; Die Funktion arbeitet nun wie gewünscht, da es eine unbekannte Anzahl von Argumenten akzeptiert. Ich habe den ursprünglichen Codepen (http://codepen.io/PiotrBerebecki/pen/ZWxvzm) aktualisiert, um diese Implementierung zu demonstrieren.

function symmetricDifference(arr) { 
    let args = Array.prototype.slice.call(arguments); 
    let result = args[0]; 
    for (var i = 1; i < args.length; i++) { 
    result = result.concat(args[i]).filter(function(item) { 
     return result.indexOf(item) === -1 || args[i].indexOf(item) === -1; 
    }); 
    } 
    // remove duplicates and sort 
    return Array.from(new Set(result)).sort((a, b) => a - b); 
} 
+1

Es ist einfacher, die Schleife von '1' nach' args.length' laufen zu lassen. Auch gibt es keinen Grund, diese 'temp'-Variable einzuführen, Sie können nur an' result' arbeiten. – Bergi

+0

Ich habe gerade die 'loop'-Bedingungen aktualisiert und die unnötige 'temp'-Variable gemäß Ihren Hinweisen entfernt. Der Code scheint jetzt viel sauberer zu sein. Sehr geschätzt. –