Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Object.keys()获取字典的键_Javascript - Fatal编程技术网

Javascript 使用Object.keys()获取字典的键

Javascript 使用Object.keys()获取字典的键,javascript,Javascript,我可以通过输入索引的数值来检索值,如下所示: Object.keys(myHash)[0] ,但是如果我使用一个变量来访问下面的内容,结果总是未定义的。有人知道为什么会这样吗 Object.keys(myHash)[indexVariable] 下面是另一个例子: function compute() { var hashmap= new Array(); hashmap['a']=14; hashmap['b']=2; hashmap['c']=3; hashmap['d']=4; ha

我可以通过输入索引的数值来检索值,如下所示:

Object.keys(myHash)[0]
,但是如果我使用一个变量来访问下面的内容,结果总是未定义的。有人知道为什么会这样吗

Object.keys(myHash)[indexVariable]
下面是另一个例子:

function compute() {
var hashmap= new Array(); 
hashmap['a']=14;
hashmap['b']=2;
hashmap['c']=3;
hashmap['d']=4;
hashmap['e']=5;
hashmap['f']=6;
hashmap['g']=7;
hashmap['h']=8;
for (var each in hashmap){
    console.log(Object.keys(hashmap)[each]);
}

}

您的示例无法运行,数组不应具有自定义键。改用对象

var hashmap = {
    a: 14,
    b: 2,
    c: 3,
    d: 4,
    e: 5,
    f: 6,
    g: 7,
    h: 8
}
[编辑]并且无需为..使用
。。在
中,将
Object.keys
Array.prototype.forEach()结合使用

Object.keys()
只是一个键名数组-您不能直接使用它来访问原始对象的元素

尽管您应该将
hashmap
声明为
对象
而不是
数组
,但没有必要使用
对象.键
,除非您确实需要对象自身(可枚举)属性的名称。您的
用于。。。在
中,循环也同样有效:

for (var each in hashmap) {
    console.log(hashmap[each]);
}
使用
Object.keys()
唯一额外的好处是保证不会遍历从原型继承的键,但也可以复制:

for (var each in hashmap) {
    if (hashmap.hasOwnProperty(each)) {
        console.log(hashmap[each]);
    }
}

因为
indexVariable
不包含您认为它的功能?
在该示例中,每个
都不是一个数值。您是对的。当您在hashamp上迭代时,它将键值用作“each”,而不应将
用于。。在
中,因为它可能也会枚举原型属性(取决于平台)。@nietonfir是的,我已经解决了这个问题。实际上,数组完全能够拥有自定义密钥-数组在这方面与任何其他JS对象一样。FWIW,我认为在这种情况下,
.forEach
样式的循环是过分的-除非您特别希望引入额外的作用域(可能是为了帮助绑定回调参数)
。。。in
循环更有效。是的,尽管我想知道什么时候会发生这种情况,因为我可以发誓两年前这是不可能的@niietonfir始终可以向数组添加属性,这就是为什么使用
for。。。in
对数组不正确-它同时枚举数值索引和任何属性,包括继承的属性。@Alnitak One从不停止学习新事物。一定要爱我!;-)尽管无法使用自定义键值对初始化数组:
arr=[a:“foo”,b:“bar”]
arr=新数组(a:“foo”,b:“bar”)(这就是为什么我错误地认为自定义键在JS数组中是不可能的)。
for (var each in hashmap) {
    if (hashmap.hasOwnProperty(each)) {
        console.log(hashmap[each]);
    }
}