есть ли словари в javascript, как python?


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

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

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

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

7 76

7 ответов:

Это старый пост, но я думал, что должен предоставить иллюстрированный ответ в любом случае.

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

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

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

states_dictionary.AK[0] //which is liza

или вы можете использовать JavaScript literal object notation, в результате чего ключи не должны быть в кавычках:

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

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

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

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

создали простой словарь в 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) временной сложности или даже меньше. Как слияние / быстрая сортировка по массивам, а затем некоторые B-поиск для поиска. Я не давал попробовать или искал о сопоставлении хэш-функции в JS.

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

надеюсь, что это помогает!

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

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

виз: дикт.метод hasOwnProperty(ключ)иудалить dict [key]

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

спасибо!

Я понимаю, что это старый вопрос, но он появляется в 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({});

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

старый вопрос, но мне недавно нужно было сделать порт AS3>JS, и ради скорости я написал простой объект словаря AS3-style для 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

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

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

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