有类似python的javascript字典吗?

有类似python的javascript字典吗?,javascript,python,Javascript,Python,我需要像这样用javascript制作一个字典 我不记得确切的符号,但它是这样的: states_dictionary={ CT=[alex,harry], AK=[liza,alex], TX=[fred, harry] ........ } javascript中有这样的东西吗?使用javascript对象。您可以像访问字典中的键一样访问它们的属性。这是JSON的基础。语法类似于Python字典。请参阅:直到2015年,Javascript中才出现真正的关联数组(ECMAScript 6的

我需要像这样用javascript制作一个字典

我不记得确切的符号,但它是这样的:

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

javascript中有这样的东西吗?

使用javascript对象。您可以像访问字典中的键一样访问它们的属性。这是JSON的基础。语法类似于Python字典。请参阅:

直到2015年,Javascript中才出现真正的关联数组(ECMAScript 6的发布)。从那时起,您可以将贴图对象用作Robocat状态。例如:

let map = new Map();
map.set('key', {'value1', 'value2'});
let values = map.get('key');
如果不支持ES6,您可以尝试使用对象:

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

但是,对于对象,不可能使用典型的数组属性或方法,如array.length。至少可以在for-in循环中访问“object array”。

这是一篇老文章,但我想我还是应该提供一个说明性的答案

使用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"]
};

这是一个老问题,但我最近需要做一个AS3>JS端口,为了提高速度,我为JS编写了一个简单的AS3样式字典对象:

如果您不知道,AS3字典允许您使用任何对象作为键,而不仅仅是字符串。一旦你找到了它们的用途,它们就会派上用场

它的速度不如本机对象快,但我没有发现它在这方面有任何重大问题

API:


Firefox13+提供了
map
对象的实验性实现,类似于python中的
dict
对象

它只在firefox中可用,但它看起来比使用
新对象()的属性要好。
。文献引文:

  • 对象有一个原型,因此地图中有默认关键点。但是,可以使用
    map=Object.create(null)
    绕过此选项
  • 对象
    的键是
    字符串
    ,它们可以是
    映射
    的任何值
  • 当您必须手动跟踪
    对象的大小时,您可以轻松获得
    贴图的大小

我们在这里用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";
        }
    }
}
这只是一个基本的模拟。 可以通过实现更好的运行时算法来进一步优化它,使其至少在O(nlogn)时间复杂度下工作,甚至更低。比如对数组进行合并/快速排序,然后进行B搜索查找。 在JS中映射哈希函数时,我没有尝试或搜索过

此外,JSdict obj的键和值可以被转换为私有变量,以进行隐藏

希望这有帮助

编辑>> 在实现了上述内容之后,我个人将JS对象用作现成的关联数组

然而,我想特别提到两种方法,它们实际上证明有助于使它成为一种方便的哈希表体验

即:dict.hasOwnProperty(key)删除dict[key]

阅读这篇文章是了解这一实现/用法的好资源。


谢谢

我意识到这是一个老问题,但当您搜索“javascript字典”时,它会在Google中弹出,因此我想补充上述答案,在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({});

请看这个问题:您接受的答案是非常错误的。@EsbenSkovPedersen您在该答案中注意到了哪些错误?我看到它在我发表评论后被编辑了。似乎:missingRead是ES6地图的最新答案(出于与发布相同的原因进行评论)性能如何?在对象中查找键是恒定时间吗?因为o[“key”]相当于Javascript中的o.key,所以性能几乎相同。但是,性能取决于Javascript引擎/Webbrowser。这两个版本之间有很大的区别,尤其是在旧版本中。ECMAScript 6定义了一个正式的映射对象(即“Javascript中没有真正的关联数组”现在是不正确的)。值得注意的是,第一个示例应该在两种语言中生成相同的对象,使用完全相同的语法,除了结束符“;”。states_dictionary={“CT”:[“alex”,“harry”],“AK”:[“liza”,“alex”],“TX”:[“fred”,“harry”]}我更习惯于文字对象符号,因为您以相同的方式访问它们,两者之间有什么区别?@JohnDemetriou主要区别是javascript对象符号键必须是字符串(用双引号括起来) ). 对象表示法如JSON中的data interchage所示,其灵感来源于文字对象表示法;值得注意的是,JSON通常用于字符串上下文实际上,Python允许语句终止分号,因此第一个示例在Python和Javascript中完全有效。如果值来自用户,则需要注意使用
Object.hasOwnProperty.call(dictionary,key)
(否则,用户可以输入valueOf值,并且
字典['valueOf']
返回属于对象原型的
对象。valueOf()
函数,这可能不是您的代码所期望的-潜在错误或安全问题)。如果键不是字符串类型,则需要小心,否则隐式数字和toString转换将给您带来问题。ES6
Map
类型旨在为字典提供扩展功能。非常好而且有用的库!我添加了一个get函数,我认为它丢失了,并修复了一些小问题ntax问题(缺少分号等)。这是修改后的fiddle:Good job mate,不知道为什么它不在那里!对我有用,很高兴使用更干净的ES6方法。谢谢!接下来,我们知道“bulk set()”的任何方法,例如python
di
var dict = new Map();
dict.set("foo", "bar");

//returns "bar"
dict.get("foo");
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({});