2017-12-06 7 views
3

私のサイトでいくつかのテストを実行している間、私はそれに10文字列しか含まない配列で終わったが、非常に高いインデックス(600 000 000)を持つ配列で終わった。Javascript:indexOfスパース配列にもかかわらず高インデックスでは遅いですか?

この配列でindexOfを実行するのは非常に遅く、呼び出しごとにタブ全体が数秒間フリーズします。

これについての情報を探したところ、現代のJavascript実装ではまばらな配列が使用されているため、問題ではないと言われていました。私は最新のChrome 62を使用しています。

問題は実際には開発者用ツールのコンソールで再現可能です。次のコードで実行しようとした場合:

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

をあなたはJavascriptが0から6億にすべてのインデックスをループではなく、一つの要素に直接スキップされていることを示す、コンソールがインデックスを返すために数秒を要していることがわかります。これは正常な動作ですか?

+2

はい、それはこれが助けhttps://stackoverflow.comかもしれJavaScriptが – moon

+0

をどのように動作するかです/ questions/8668174/indexof-object-array-object-array – moon

+1

この関数は、すべての単一インデックスを調査する必要があります。 JavaScriptランタイムがこのような状況に対処するときは、将来的には時間がかかるかもしれませんが、現在はありません。 – Pointy

答えて

3

私は、これは「正常な」行動ですが、簡単に交換が可能かどうか分からない:

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

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

賢明な回避策。 'Object.keys'は実際に値を保持するインデックスの配列を返します(この場合は' ["600000000"] 'を返します)、それは高価ではありません。 –

+1

ニースと良い答え。私はこの良い答えによって学んだ – moon

関連する問題