2010-09-10 4 views

Antwort

8

Nein, es ist nichts eingebaut. Außerdem müssen Sie beachten, dass die Standardsortierung lexikalisch ist, sodass [9, 1, 10].sort()[1, 10, 9] zurückgibt.

Im Folgenden wird sortieren und entfernen Sie Duplikate aus einer Reihe von Zahlen an Ort und Stelle:

function sortAndRemoveDuplicates(arr) { 
    arr.sort(function(a, b) { return a - b; }); 
    var copy = arr.slice(0); 
    arr.length = 0; 

    for (var i = 0, len = copy.length; i < len; ++i) { 
     if (i == 0 || copy[i] != copy[i - 1]) { 
      arr.push(copy[i]); 
     } 
    } 
    return arr; 
} 

var arr = [1, 4, 7, 1, 2, 1, 3, 10, 1, 4, 10]; 
sortAndRemoveDuplicates(arr); 
console.log(arr); // [1, 2, 3, 4, 7, 10] 
+0

Vielen Dank !!! –

4

Die Underscore library ist für alle jene Arten von Tricks; Ich liebe es und würde ohne es nicht leben können !!

Sobald Sie es erklären, rufen Sie seine Funktionen mit der Unterstrich, wie folgt aus:

_.uniq([1, 4, 7, 1, 2, 1, 3, 1, 4]); 
=> [1, 4, 7, 2, 3] 

Wenn Sie es nach:

_.uniq([1, 4, 7, 1, 2, 1, 3, 1, 4]).sort(); 
=> [1, 2, 3, 4, 7] 

Von der Seite verlinkt sind oben:

"Underscore bietet 60 Funktionen, die sowohl die üblichen funktionalen Verdächtigen unterstützen: map, select, invoke - als auch spezialisiertere Helfer: function binding, javasc Skriptvorlagen, tiefe Gleichheitsprüfungen und so weiter. "

+0

+1 für Underscore - aber wenn das OP nach einer JavaScript-Funktion fragt, die das tut, was "uniq" tut, warum nicht herausziehen, um sein Problem zu lösen, und dann darauf hinweisen, dass all dies und mehr in der Bibliothek zu finden sind ? :-) –

+2

Nun ... _.uniq verwendet _.reduce, das _.each verwendet ... Das wäre nicht sehr explizit ... – Bambax

1
Array.prototype.unique = function(){ 
    for(var i = 0; i < this.length; i++){ 
     if(this.indexOf(this[i], i+1) != -1){ 
      this.splice(i,1); 
      i--; 
     } 
    } 
    return this.sort(); 
} 

var x = [1,'x', 4, 7, 1, 2, 1,'x', 3, 1, 4]; 
x.unique() // [1, 2, 3, 4, 7, "x"] 
1

Ab JavaScript 1.6, Array.filter() verwendet werden kann doppelte Werte zu entfernen:

[1, 4, 7, 1, 2, 1, 3, 1, 4] 
    .filter(function (value, index, self) { 
     return self.indexOf(value) === index; 
}); 

kehrt

[1, 4, 7, 2, 3] 

Was schön ist, über Filter ist es funktioniert für alle Werttypen im Array:

[1, "d", 4, "e", 7, "e", 1, "a", 2, "d", 1, "b", 3, "c", 1, "e", 4] 
    .filter(function (value, index, self) { 
     return self.indexOf(value) === index; 
    }); 

kehrt

[1, 2, 3, 4, 7, "a", "b", "c", "d", "e"]