есть ли в javascript словари как python? - PullRequest
81 голосов
/ 24 августа 2010

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

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

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

Есть ли такая вещь в JavaScript?1006 *

Ответы [ 7 ]

103 голосов
/ 03 августа 2012

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

Использовать нотацию объектов 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"]
};
45 голосов
/ 24 августа 2010

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

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

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

9 голосов
/ 07 октября 2015

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

Здесь создали простой словарь в 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 в качестве ассоциативных массивов, которые доступны "из коробки".

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

То есть: dict.hasOwnProperty (ключ) и delete dict [ключ]

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

спасибо!

4 голосов
/ 24 августа 2010

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

3 голосов
/ 24 марта 2013

Старый вопрос, но недавно мне нужно было сделать порт 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
1 голос
/ 24 июня 2013

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

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

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