2013-12-02 4 views
1

This answer говорят, что лучший способ для перебора разреженных массивов заключается в использовании for X in ArrayПеребора разреженных массивов

Однако, когда я попытался это я споткнулся, потому что тип X был строкой, а не целый индекс I ожидал. (Все хорошо, пока я добавил его в другое целое число ...)

var arr = []; 
arr[10000] = "Hello"; 

var shifted = [] 

for (var x in arr) 
    shifted[10+x] = arr[x]; 

"ожидаемым":

shifted[10010] = "Hello 

Actual

shifted["1010000"] = "Hello" 

Есть ли лучший способом итерации разреженного массива используя индекс, или я должен просто использовать Number(X), где это необходимо?

+3

В этом сообщении они повторяют объекты, а не массивы ... Можете ли вы показать пример своего массива и рассказать нам, что вы на самом деле хотите сделать? – Teemu

+0

Внутренние, разреженные ключи 'Array' обрабатываются как' String'. – Florent

+0

@Teemu - обновлено, извините. – Roddy

ответ

1

Это как V8 (и другие JavaScript двигатели) обрабатывает массивы:

V8 использует два различных метода для обработки массивов:

  • Быстрые элементы:
    Предназначен для массивов где набор клавиш очень компактный. Они имеют линейный буфер хранения , к которому можно получить доступ очень эффективно.

  • словарь элементы:
    Предназначен для разреженных массивов, которые не имеют все элементы внутри них. Это на самом деле хэш-таблица, дороже доступа, чем «Fast Элементов»

Источник:http://thibaultlaurens.github.io/javascript/2013/04/29/how-the-v8-engine-works/

При использовании разреженного массива, ключ преобразуется в строку а затем хэшировали. Если вы хотите числовые клавиши: не используйте разреженный массив или вручную конвертируйте ключ в число.

+0

Спасибо. Но если массив не разрежен, остается ли ключ возвращаться как строка в моем 'for X in Array'? – Roddy

+0

@Roddy No. Когда вы используете 'for in', вы выполняете итерацию через свойства объекта. Свойство всегда является строкой. Поэтому, даже если ваш массив не разрежен, 'for in' вернет строки. – Florent

Смежные вопросы