2017-12-06 1 views
3

Während ich einige Tests auf meiner Site ausgeführt habe, habe ich ein Array gefunden, das nur 10 String enthält, aber einen mit einem sehr hohen Index (600 000 000).Javascript: indexOf langsam auf hohem Index trotz Sparse Array?

Das Ausführen von indexOf auf diesem Array ist sehr langsam, wodurch die gesamte Registerkarte für einige Sekunden für jeden Anruf einfriert.

Als ich versuchte, nach Informationen darüber zu suchen, schienen die meisten zu sagen, dass moderne Javascript-Implementierungen sparse Array verwenden und dass es kein Problem sein sollte. Ich verwende das neueste Chrome 62.

Das Problem ist eigentlich nur in der Developer Tools-Konsole reproduzierbar. Wenn Sie versuchen Sie den folgenden Code:

test = []; 
test[600000000] = "test"; 
test.indexOf("test"); 

Sie werden sehen, dass die Konsole mehrere Sekunden in Anspruch nimmt den Index zurück, was darauf hinweist, dass Javascript in jedem Index 0-600.000.000 wird Looping anstatt direkt an dem ein Element Skipping . Ist das normales Verhalten?

+2

Ja, das ist wie JavaScript – moon

+0

funktioniert Dies kann eine Hilfe sein https://stackoverflow.com/questions/8668174/indexof-method-in-ein-objekt-array – moon

+1

Die Funktion muss noch jeden einzelnen Index untersuchen. Es mag einige Zeit in der Zukunft geben, wenn JavaScript-Laufzeiten mit dieser Situation umgehen, aber derzeit nicht. – Pointy

Antwort

3

Ich bin mir nicht sicher, ob die „normale“ Verhalten, sondern ein einfacher Austausch wäre:

function sparseIndexOf(arr, value) { 
    return Object.keys(arr).find(function(k) { 
     return arr[k] === value; 
    }) 
} 

test = []; 
test[600000000] = "test"; 
sparseIndexOf(test, "test") 
+1

Cleverer Workaround. 'Object.keys' gibt ein Array von Indizes zurück, die tatsächlich einen Wert enthalten (in diesem Fall wird' ["600000000"] 'zurückgegeben), so dass es nicht teuer ist. –

+1

Schöne und gute Antwort. Ich habe durch diese gute Antwort gelernt – moon

Verwandte Themen