2016-08-01 15 views
2

Ich habe eine einfache Lösung für das Problem:Ist es in JavaScript möglich, nur .filter() zu verwenden, um Duplikate zu entfernen (die erste Instanz wird beibehalten)?

function removeExtra(arr) { 
    var args = [...arguments] 
    .reduce(function(prev,curr){return prev.concat(curr)}); 
    var answer = []; 
    for (var i = 0; i < args.length; i++) { 
    if (answer.indexOf(args[i]) == -1) 
     answer.push(args[i]); 
    } 
    return answer; 
} 

console.log(removeExtra([1, 3, 2], [5, 2, 1, 4], [2, 1])); 
//-> Returns [1, 3, 2, 5, 4] 

Aber ich versuche, die Logik der JavaScript funktionaler Methoden, in diesem Fall zu üben, .filter(). Gibt es eine Möglichkeit, dies auf diese Weise zu tun?

function removeExtra(arr) { 
    return [...arguments] 
    .reduce((pre,cur) => pre.concat(cur)) 
    //.filter(x => ???); 
} 

console.log(removeExtra([1, 3, 2], [5, 2, 1, 4], [2, 1])); 
//-> Should be [1, 3, 2, 5, 4] 

Edit 1:

Wie bereits angedeutet, gerade in Set(). Dies ist das erste Mal, dass ich darauf gestoßen bin. Seid gleich zurück für die Forschungsarbeit!

Edit 2:

BIG dank @Kaspars und @gcampbell für Set() Einführung !! Ich habe jetzt meine Lösung:

function removeExtra(someArgs) { 
    return [... new Set(
    [...arguments].reduce(function(prev,curr){ 
      return prev.concat(curr); 
    }) 
)] 
} 

Dies ist nur eine kleine Revision zu gcampbell Antwort, da ich die Set zurück zu einem Array konvertieren [... new Set()]

+3

Wie wäre es http://stackoverflow.com/a/14821032/670396 – elclanrs

+2

'neue Set ([... Argumente] .reduce ((pre, Aktuell) => pre.concat (CUR))' ? – gcampbell

Antwort

2

Verwenden Sie ein Set dafür verwenden könnten.

function removeExtra() { 
    const uniques = new Set(); 

    for(const array of ...arguments) { 
     for(const element of array) { 
      uniques.add(element); 
     } 
    } 

    return Array.from(uniques); 
} 
+0

Wow, danke für die Big O Notationen.Welche Referenz würdest du empfehlen, um mehr darüber zu lernen? – jpls93

+0

@JohnPatrick Hier ist ein ES6 Verweis auf die Set-Struktur http://www.ecma-international.org/ecma-262/6.0 /#sec-set.prototype.add Es ist in einer hashmap implementiert, also nicht linear, aber auch nicht in logarithmischer Zeit.Die Leistung ist schneller, da Array.indexOf davon nicht profitieren kann – Kaspars