Массив и ассоциативен и индексируем?

Может массив в JavaScript быть ассоциативным И индексируемым?

Я хотел бы смочь к поиску объект в массиве его положением или значением ключа.

38
задан Alexander Abakumov 2 August 2019 в 22:11
поделиться

5 ответов

В Javascript нет таких вещей, как ассоциативные массивы. Вы можете использовать объектные литералы, которые выглядят как ассоциативные массивы, но имеют неупорядоченные свойства. Обычные массивы Javascript основаны на целочисленных индексах и могут

28
ответ дан 27 November 2019 в 03:34
поделиться

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

Однако вы, похоже, спрашивая другое - можете ли вы найти одно и то же значение по индексу или ключу. Это не требование для ассоциативных массивов (см. Статью в Википедии). Ассоциативные массивы не обязательно должны давать вам возможность получать значение по индексу.

Массивы JavaScript очень похожи на объекты JavaScript.

  arr=[];
  arr[0]="zero";
  arr[1]="one";
  arr[2]="two";
  arr["fancy"]="what?";

Да, это массив, и да, вы можете обойтись нечисловыми индексами. (Если вам интересно, после всего этого arr.length будет 3.)

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

Ссылка на мой блог по этой теме.

22
ответ дан 27 November 2019 в 03:34
поделиться

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

Если вы ищете карту, которая принимает произвольные ключи, вам придется использовать неродную реализацию . Скрипт предназначен для быстрой итерации, а не для произвольного доступа по числовым индексам, поэтому он может быть не тем, что вы вы ищете.

Базовая реализация карты, которая будет делать то, что вы просите, может выглядеть так:

function Map() {
    this.length = 0;
    this.store = {};
}

Map.prototype.get = function(key) {
    return this.store.hasOwnProperty(key) ?
        this.store[key] : undefined;
};

Map.prototype.put = function(key, value, index) {
    if(arguments.length < 3) {
        if(this.store.hasOwnProperty(key)) {
            this.store[key].value = value;
            return this;
        }

        index = this.length;
    }
    else if(index >>> 0 !== index || index >= 0xffffffff)
        throw new Error('illegal index argument');

    if(index >= this.length)
        this.length = index + 1;

    this[index] = this.store[key] =
        { index : index, key : key, value : value };

    return this;
};

Аргумент index для put () равен необязательно.

Вы можете получить доступ к значениям в карте map либо по ключу, либо по индексу через

map.get('key').value
map[2].value
9
ответ дан 27 November 2019 в 03:34
поделиться

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

РЕДАКТИРОВАТЬ:

как указывает Perspx, на самом деле в javascript нет настоящих ассоциативных массивов. Оператор foo ["bar"] - это просто синтаксический сахар для foo.bar

Если вы доверяете браузеру поддерживать порядок элементов в объекте, вы можете написать функцию

function valueForIndex(obj, index) {

    var i = 0;
    for (var key in obj) {

        if (i++ == index)
            return obj[key];
    }
}
6
ответ дан 27 November 2019 в 03:34
поделиться
var stuff = [];
stuff[0] = "foo";
stuff.bar = stuff[0]; // stuff.bar can be stuff["bar"] if you prefer
var key = "bar";
alert(stuff[0] + ", " + stuff[key]); // shows "foo, foo"
1
ответ дан 27 November 2019 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: