ассоциативный массив против объекта в JavaScript - PullRequest
59 голосов
/ 09 ноября 2011

В моем скрипте необходимо создать хеш-таблицу, я искал в Google это. Большинство людей рекомендуют объект JavaScript для этой цели. Проблема в том, что некоторые ключи в хеш-таблице имеют "." в них. Я могу легко создавать эти ключи с помощью ассоциативных массивов.

Я не понимаю, почему ассоциативные массивы плохие. Первое, что упоминается на сайтах, на которые я смотрел, это свойство length. Я пришел из Perl, где использовал хеши. Чаще всего использовались для получения значения из ключа, проверки наличия ключа, удаления пары ключ-значение, добавления пары ключ-значение. Если это мое общее использование, могу ли я безопасно использовать ассоциативный массив?

Ответы [ 7 ]

87 голосов
/ 09 ноября 2011

В JavaScript объекты являются ассоциативными массивами ... для них не существует отдельных концепций. Вы также можете безопасно использовать «.» в имени ключа, но вы можете получить доступ только к значению с помощью скобки:

var foo = {}
foo['bar'] = 'test';
foo['baz.bin'] = 'value';

alert(foo.bar); // shows 'test'
alert(foo['baz.bin']); // shows 'value'

Если вы уже используете их, и они работают, вы в безопасности.

33 голосов
/ 09 ноября 2011

В javascript объект и массив - это почти одно и то же: массив обладает некоторой магической функциональностью (свойство длины автообновления и т. Д.) И методы-прототипы, подходящие для массивов. Также гораздо проще построить объект, чем использовать ассоциативный массив:

var obj = {"my.key": "myValue"};

против

var obj = [];
obj["my.key"] = "myValue";

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

Некоторые функции:

var obj = {}; //Initialized empty object

удалить пару ключ-значение:

delete obj[key];

проверить, существует ли ключ:

key in obj;

получить значение ключа:

obj[key];

добавить пару ключ-значение:

obj[key] = value;
19 голосов
/ 09 ноября 2011

Поскольку в javascript нет такой вещи, как встроенные ассоциативные массивы.Вот почему это плохо.

На самом деле, когда вы используете что-то вроде:

theArray["a"] = "hello, world!";

Он просто создает НЕДВИЖИМОСТЬ, называемую "a", и устанавливает для нее значение "привет, мир!".Вот почему длина всегда равна 0, и поэтому вывод alert(theArray) пуст.

Надеюсь, это поможет!

8 голосов
/ 09 ноября 2011

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

Итак,хеш perl и объект ECMAscript ведут себя одинаково.Вы можете не знать, что вы можете получить доступ к свойствам объекта не только через точку, но также с помощью скобок и строк, например

var myObj = { foo: 42 };

myObj.foo; // 42
myObj['foo']; // 42

, зная, что вы также можете использовать ключи с .

var myObj = { };
myObj['hello.foo.world'] = 42;

Конечно, вы можете получить доступ к этому ключу только с помощью скобок.

7 голосов
/ 09 ноября 2011

Вы можете использовать . в именах ключей на объектах JS (или ассоциативных массивах), если хотите, они принимаются без проблем.Незначительным недостатком является то, что вы не можете использовать сокращенные обозначения с пунктирными клавишами, например,

var x = {};
x['hello'] = 'there';
alert(x.hello);

вполне приемлемо и выдает предупреждение с надписью «там».Но если вы используете точечное имя:

var x = {};
x['this.is'] = 'sparta';
alert(x.this.is);

не удастся, так как Javascript будет искать атрибут с именем this в объекте x, который не существует.Существует только атрибут this.is.

3 голосов
/ 09 ноября 2011

Не существует ассоциативного массива, это просто объект.

foo.bar;    // Equivalent to...
foo["bar"]; // Looks like associative array.
1 голос
/ 09 июня 2016

Для удобства использования данных не должно быть никакой разницы между объектом и массивом. Вы можете думать об этом как об объекте или как об ассоциативном массиве. В конце концов, вы можете думать обо всем как о data .

  • Для PHP , [] принимает 0, 1 или более элементов (массив) и называется ассоциативный массив . Это Json в пальто PHP:

    $data = ["message"=>[ "id"=>405, "description"=>"Method not allowed.", "detail"=>[]], "object" => []];

  • Для Javacript , {} ​​принимает 0, 1 или более элементов (массив), и это называется объект . Этот формат данных Json:

    data = {"message": { "id":405, "description":"Method not allowed.", "detail" : {}}, "object" : {}};

Я просто называю их данными . Простейшим способом описания данных является Json или его варианты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...