Подтвердить что ты не робот

Есть ли словари в javascript, например python?

Мне нужно сделать словарь в javascript, как это

Я не помню точные обозначения, но это было что-то вроде:

states_dictionary={ CT=[alex,harry], AK=[liza,alex], TX=[fred, harry] ........ }

Есть ли такая вещь в javascript?

4b9b3361

Ответ 1

Это старый пост, но я все равно решил дать иллюстрированный ответ.

Используйте javascript объектную нотацию. Вот так:

states_dictionary={ 
     "CT":["alex","harry"], 
     "AK":["liza","alex"], 
     "TX":["fred", "harry"]
};

И для доступа к значениям:

states_dictionary.AK[0] //which is liza

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

states_dictionary={ 
     CT:["alex","harry"], 
     AK:["liza","alex"], 
     TX:["fred", "harry"]
};

Ответ 2

В Javascript нет реальных ассоциативных массивов. Вы можете попробовать использовать объекты:

var x = new Object();
x["Key"] = "Value";

Однако с объектами невозможно использовать типичные свойства массива или методы типа array.length. По крайней мере, можно получить доступ к "объекту-массиву" во встроенном цикле.

Ответ 3

Создали простой словарь в JS здесь:

function JSdict() {
    this.Keys = [];
    this.Values = [];
}

// Check if dictionary extensions aren't implemented yet.
// Returns value of a key
if (!JSdict.prototype.getVal) {
    JSdict.prototype.getVal = function (key) {
        if (key == null) {
            return "Key cannot be null";
        }
        for (var i = 0; i < this.Keys.length; i++) {
            if (this.Keys[i] == key) {
                return this.Values[i];
            }
        }
        return "Key not found!";
    }
}


// Check if dictionary extensions aren't implemented yet.
// Updates value of a key
if (!JSdict.prototype.update) {
    JSdict.prototype.update = function (key, val) {
        if (key == null || val == null) {
            return "Key or Value cannot be null";
        }
        // Verify dict integrity before each operation
        if (keysLength != valsLength) {
            return "Dictionary inconsistent. Keys length don't match values!";
        }
        var keysLength = this.Keys.length;
        var valsLength = this.Values.length;
        var flag = false;
        for (var i = 0; i < keysLength; i++) {
            if (this.Keys[i] == key) {
                this.Values[i] = val;
                flag = true;
                break;
            }
        }
        if (!flag) {
            return "Key does not exist";
        }
    }
}



// Check if dictionary extensions aren't implemented yet.
// Adds a unique key value pair
if (!JSdict.prototype.add) {
    JSdict.prototype.add = function (key, val) {
        // Allow only strings or numbers as keys
        if (typeof (key) == "number" || typeof (key) == "string") {
            if (key == null || val == null) {
                return "Key or Value cannot be null";
            }
            if (keysLength != valsLength) {
                return "Dictionary inconsistent. Keys length don't match values!";
            }
            var keysLength = this.Keys.length;
            var valsLength = this.Values.length;
            for (var i = 0; i < keysLength; i++) {
                if (this.Keys[i] == key) {
                    return "Duplicate keys not allowed!";
                }
            }
            this.Keys.push(key);
            this.Values.push(val);
        }
        else {
            return "Only number or string can be key!";
        }
    }
}

// Check if dictionary extensions aren't implemented yet.
// Removes a key value pair
if (!JSdict.prototype.remove) {
    JSdict.prototype.remove = function (key) {
        if (key == null) {
            return "Key cannot be null";
        }
        if (keysLength != valsLength) {
            return "Dictionary inconsistent. Keys length don't match values!";
        }
        var keysLength = this.Keys.length;
        var valsLength = this.Values.length;
        var flag = false;
        for (var i = 0; i < keysLength; i++) {
            if (this.Keys[i] == key) {
                this.Keys.shift(key);
                this.Values.shift(this.Values[i]);
                flag = true;
                break;
            }
        }
        if (!flag) {
            return "Key does not exist";
        }
    }
}

Вышеупомянутая реализация теперь может использоваться для имитации словаря как:

var dict = new JSdict();

dict.add(1, "one")

dict.add(1, "one more")
"Duplicate keys not allowed!"

dict.getVal(1)
"one"

dict.update(1, "onne")

dict.getVal(1)
"onne"

dict.remove(1)

dict.getVal(1)
"Key not found!"

Это просто базовое моделирование. Его можно дополнительно оптимизировать, реализовав более эффективный алгоритм времени работы для работы по крайней мере в O (nlogn) сложности времени или даже меньше. Как merge/quick sort на массивах, а затем некоторый B-поиск для поиска. Я не попробовал или не искал отображение хэш-функции в JS.

Кроме того, ключ и значение для объекта JSdict obj можно превратить в частные переменные, чтобы быть подлым.

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

ИЗМЕНИТЬ → После выполнения вышеописанного я лично использовал объекты JS как ассоциативные массивы, которые доступны из коробки.

Однако я хотел бы особо упомянуть о двух методах, которые на самом деле оказались полезными для удобства использования хэш-таблицы.

Viz: dict.hasOwnProperty(ключ) и удалить dict [key]

Прочитайте этот пост как хороший ресурс по этой реализации/использованию. Динамическое создание ключей в ассоциативном массиве JavaScript

БЛАГОДАРЯ!

Ответ 4

Я понимаю, что это старый вопрос, но он появляется в Google, когда вы ищете словари javascript, поэтому я хотел бы добавить к приведенным выше ответам, что в ECMAScript 6 официальный объект Map, который представляет собой реализацию словаря:

var dict = new Map();
dict.set("foo", "bar");

//returns "bar"
dict.get("foo");

В отличие от обычных объектов javascript, он позволяет любому объекту в качестве ключа:

var foo = {};
var bar = {};
var dict = new Map();
dict.set(foo, "Foo");
dict.set(bar, "Bar");

//returns "Bar"
dict.get(bar);

//returns "Foo"
dict.get(foo);

//returns undefined, as {} !== foo and {} !== bar
dict.get({});

Ответ 5

Используйте объекты JavaScript. Вы можете получить доступ к своим свойствам, таким как ключи в словаре. Это основа JSON. Синтаксис аналогичен словарям Python. См.: JSON.org

Ответ 6

Старый вопрос, но мне недавно нужно было сделать AS3 > JS-порт, и для скорости я написал простой объект словаря AS3 для JS:

http://jsfiddle.net/MickMalone1983/VEpFf/2/

Если вы не знаете, словарь AS3 позволяет использовать любой объект в качестве ключа, а не только строки. Они очень удобны, если вы нашли для них пользу.

Это не так быстро, как может быть нативный объект, но в этом отношении я не нашел серьезных проблем.

API:

//Constructor
var dict = new Dict(overwrite:Boolean);

//If overwrite, allows over-writing of duplicate keys,
//otherwise, will not add duplicate keys to dictionary.

dict.put(key, value);//Add a pair
dict.get(key);//Get value from key
dict.remove(key);//Remove pair by key
dict.clearAll(value);//Remove all pairs with this value
dict.iterate(function(key, value){//Send all pairs as arguments to this function:
    console.log(key+' is key for '+value);
});


dict.get(key);//Get value from key

Ответ 7

Firefox 13+ предоставляет экспериментальную реализацию объекта map, аналогичного объекту dict в python. Технические характеристики здесь.

Он доступен только в firefox, но выглядит лучше, чем при использовании атрибутов new Object(). Цитирование из документации:

  • Объект имеет прототип, поэтому на карте есть ключи по умолчанию. Однако это можно обойти, используя map = Object.create(null).
  • Ключом Object являются Strings, где они могут быть любым значением для map.
  • Вы можете легко получить размер map, пока вам нужно вручную отслеживать размер для Object.