2009-12-10 18 views
9

Ich mache sehr häufige Suchen in Arrays von Objekten und habe jQuery.inArray() verwendet. Allerdings habe ich Geschwindigkeit und Speicherprobleme und eine der am häufigsten genannten Methoden nach meinem Profiler ist jQuery.inArray(). Wie heißt die Leistung auf der Straße? Sollte ich zu einer einfachen for-Schleife wechseln?Sollte ich jQuery.inArray() verwenden?

Meine spezielle Funktion:

function findPoint(point, list) 
{ 
    var l = list.map(function anonMapToId(p) { return p.id }); 
    var found = jQuery.inArray(point.id, l); 
    return found; 
} 

Ist vielleicht list.map() mehr schuld?

+1

Kann ich fragen, wie Sie feststellen, dass dies ein Leistungsproblem ist? (nur aus Neugier) – calumbrodie

+1

Um ehrlich zu sein, erinnere ich mich nicht. – pr1001

+0

Schön genug, dass ich nicht bemerkt habe, dass die Frage über ein Jahr alt war ... O.K erinnerst du dich überhaupt daran, was du mit "mein Profiler" meintest? Welchen Profiler benutzt du? – calumbrodie

Antwort

14

Nun intern inArray macht eine einfache Schleife, würde ich Ihnen empfehlen, um zu überprüfen, ob es eine native Array.prototype.indexOf Implementierung und es verwenden, statt inArray falls vorhanden:

function findPoint(point, list) { 
    var l = list.map(function anonMapToId(p) { return p.id }); 
    var found = ('indexOf' in Array.prototype) ? l.indexOf(point.id) 
              : jQuery.inArray(point.id, l); 
    return found; 
} 

Die Array.prototype.indexOf Methode wurde in Browsern eingeführt worden, dass implementieren JavaScript 1.6, und es wird Teil des ECMAScript 5-Standards sein.

Native Implementierungen sind Weg schneller als nicht einheimische.

+11

jQuery tut dies bereits automatisch. http://forum.jquery.com/topic/inarray (Es ist auf den ersten Kommentar zum Beitrag) Als Nebenbei implementiert IE8 Array.prototype.indexOf nicht. – ICodeForCoffee

+2

'inArray' klingt eher so, als würde es einen booleschen Wert zurückgeben, tut es aber nicht. Mach dem nächsten Entwickler einen Gefallen und benutz 'indexOf'. –

+1

Ich denke, es wird den Zweck der "Geschwindigkeit" besiegen, wenn Sie nicht das Ergebnis des Tests für das Vorhandensein der Methode indexOf Cache zwischenspeichern. Ich glaube auch, dass jQuery das für Sie tun wird ... – Loudenvier

2

Auch ist die inArray Funktion langsam, Sie erstellen immer noch eine vollständige neue Array für jede Suche. Ich nehme an, es wäre besser, diese Suche neu zu gestalten, z. Erstellen der ID-Liste vor die Punkte zu finden, und dass man mit suchen in:

2

Ich bin ein von dem Array verbinden tun es in einen String zu drehen und den Schleifenabschnitt wie dies zu vermeiden:

var strList = ","+array.join(",")+","; 
return strList.indexOf(","+search+",") !== -1 ? true : false; 

, wenn das Array sehr groß ist, kann es weh tun, aber für eine kleine Liste, es ist viel schneller als die Schleifenlösung

PS ich eine Endung Koma bin das Hinzufügen einer wie

+0

Dies ist vielleicht nicht der schönste Weg, aber es beseitigt den Fehler "Stop running this script", den ich mit inArray in IE8 bekommen habe. – chill182

3

aussehen zu vermeiden Was Sie wirklich Wollen ist ein Array.prototype.filter.

function findPoint(point, list) 
{ 
    return list.filter(function anonFilterToId(p) { 
     return p.id === point.id; 
    }).length > 0; 
} 
1

ich immer lastIndexOf verwenden, wenn ich wissen will, ob ein String in meinem Array gibt. Also, es ist etwas wie folgt aus:

var str = 'a'; 
var arr = ['a','b','c']; 

if(arr.lastIndexOf(str) > -1){ 

     alert("String " + str + " was found in array set"); 

} else { 

     alert("String " + str + " was not found"); 

} 

Wenn Sie nur einen String in Array finden wollen, ich glaube, dies könnte die beste Praxis sein.

Verwandte Themen