JavaScript не имеет ассоциативных массивов. У него есть массивы, и у него есть объекты, а массивы оказываются объектами. Когда вы делаете это:
var a = [];
a['foo'] = 'bar';
.. вы на самом деле делаете эквивалент этого:
var a = [];
a.foo = 'bar';
// ^--- property of object 'a'
То есть вы фактически добавляете свойство с именем foo
к объекту a
, , а не добавляя элемент в массив a
.
Из документации на jQuery.each()
:
Массивы и похожие на массивы объекты со свойством length
(например, объект arguments
функции) повторяются по числовому индексу от 0
до length-1
. Другие объекты повторяются через их именованные свойства.
Поскольку вы создали Array
([]
), jQuery просматривает его свойство length
и поскольку вы не добавили никаких элементов в массив (помните только свойства для объекта) length
по-прежнему равен нулю, поэтому jQuery (правильно) ничего не делает.
Вместо этого, как отметили другие, вы хотите создать объект, используя, например, var cells = {};
. Поскольку объект, не являющийся массивом, не имеет свойства length
(во всяком случае, не по умолчанию), jQuery будет знать, что вы действительно хотите перебирать его свойства вместо числовых индексов, как в массиве.