2013-01-14 5 views
3

Мне нужно создать ассоциативный массив в javascript с ключом integer следующим образом;Создайте ассоциативный массив с целыми ключами

a["10"] = "ten"; 

но когда я создать массив, он помещает значение в 10th индекса массива, и это создает массив с длиной 11. Я хочу, чтобы это было парой ключей значения. Я знаю, что это можно сделать, используя объекты, но мне нужен только массив.

+0

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

+0

Я использую javascript с проектом в SAPUI5, и мне нужны массивы для заполнения в выпадающих меню, а выпадающие списки не поддерживают объекты. Мне нужны только массивы .. :( – WISH

+2

Javascript arrays ** are ** Objects. «Индексы» - это просто числовые имена свойств, свойство length определено как самый высокий индекс плюс один, это не количество индексов. – RobG

ответ

8

JavaScript не имеет ассоциативных массивов. Единственный способ сделать это в JavaScript, чтобы использовать объекты:

var a = { 
    '10': 'ten' 
}; 
+0

, но мне нужно иметь только массив. Нет ли такого обходного пути для этого? – WISH

+3

-1 JavaScript * имеет * ассоциативные массивы (http://en.wikipedia.org/wiki/Associative_array) (aka Map aka Dictionary), хотя и в ограниченной форме (т.е. объекты) *, которые принуждают все ключи к строкам *. Хотя термин чувствует себя довольно устаревшим, он действителен и является обычным явлением для некоторых языков, таких как Perl (и злоупотребляется на других языках, таких как PHP). –

+1

@ Daksh - Nope. Можете ли вы рассказать нам * почему * вам нужно, чтобы он был массивом? Может быть, мы можем обойти это *. –

1

ECMAScript делает имеют Associated Arrays - объекты (и расширением, Массивы) являются примером

Однако, some properties of Arrays are treated specially:

объекты массива дают специальный тр поедание определенного класса имен собственности. Имя свойства P (в виде значения String) является индексом массива тогда и только тогда, когда ToString(ToUint32(P)) равно P ..

.. В частности, всякий раз, когда это свойство добавляется имя которого является индексом массива, свойство длина изменяется, в случае необходимости, быть более, чем одним числовым значением этого индекса массива ..

Таким образом, учитывая arr = [], выражения arr["1"] и arr[1] относятся к же свойство имени. Так как P (имя свойства) равен «1», и length 0 сверху, то назначение такого имущества установит arr.length к ToUint32(P)+1 или 2.

Это не возможно изменить это поведение. Если вы хотите, чтобы не, у вас есть специальное свойство length, а затем используйте «обычный» объект вместо массива. Тем не менее, многие из Array.prototype функций могут использоваться с произвольными объектами (с некоторыми причудами реализации в стороне), которые имеют свойство length и объект может быть создано таким образом, что он использует Array.prototype в качестве своего собственного прототипа.

Все, что было сказано, сообщение не говорит, что такое реальная проблема. Вместо того, чтобы предполагать, что это должно быть сделано таким образом, подумайте о том, что такое намерение: например. почему ["10"]? И что не так, если есть «11 элементов», если объект будет использоваться в списке?


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

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