JavaScript - 获取关联数组中元素的名称

13

我有一个JavaScript对象,被视为关联数组。我们称它为 "fields"。它有多个元素,例如:

fields['element1'] = ...
fields['element2'] = ...
fields['element3'] = ...

已知fields[0],是否可以获取属性的名称(即 "element1")而不是其值?

4个回答

21

假设你有一个对象oObject,它可能是:

var oObject = {} ;
oObject["aaa"] = "AAA" ;
oObject["bbb"] = "BBB" ;
oObject["ccc"] = "CCC" ;
oObject["ddd"] = "DDD" ;
oObject["eee"] = "EEE" ;

现在,假设你想要知道它的属性名称和值,并将其放入变量strName和strValue中。 为此,您可以使用“for(x in o)”结构,就像以下示例中所示:

var strName, strValue ;

for(strName in oObject)
{
   strValue = oObject[strName] ;
   alert("name : " + strName + " : value : " + strValue) ;
}
"for(x in o)"语句会遍历对象"o"的所有属性,在每次迭代时,将当前属性名存储在变量"x"中。所以,要获取其值,只需写o[x]即可,但您已经知道这一点。

附加信息

经过一些思考,以及看到Hank Gay的评论后,我感觉附加信息可能会有趣。
让我们假装一下(并忘记"在JavaScript中,所有对象,包括数组,都是关联容器"的事情)。
通常你需要两种类型的容器:映射(Maps)和数组(Arrays)。
映射可以像上面的例子一样创建(使用"o = new Object() ;"或"o = {} ;"符号),必须通过它们的属性来访问。当然,映射是映射,不保证有序。
数组的创建方式不同,即使它们可以像映射那样被访问,但应该只通过它们的索引来访问,以确保维护顺序。
重点是:
- 如果你需要一个映射,请使用"new Object()"容器。 - 如果你需要一个数组,请使用"new Array()"容器。 - 绝对不要混淆这两个,也千万不要通过索引访问映射,对于数组,始终通过索引访问它的数据,因为如果不遵循这些原则,你将得不到你想要的结果。

请注意,其他答案正确地指出迭代顺序不能保证 - Hank Gay
@Hank Gay:感谢您的评论。我已经在我的答案中添加了这些信息。 - paercebal

9

不可以,有两个原因。

  1. fields[0]和fields["element1"]是不同的属性。
  2. 对象中的属性明确是无序的。

您可以循环遍历属性:

function (obj) {
  for (prop in obj) {
    if (obj.hasOwnProperty(prop) {
      return prop;
    }
  }
};

要获取任意时间都可能更改的“first”属性的值。

http://ajaxian.com/archives/fun-with-browsers-for-in-loop 解释了 hasOwnProperty 模式。


可能值得解释一下hasOwnProperty的作用。OP可能想要包括在原型中定义的字段的第一个字段(但最有可能他想要你的方法)。 - Blixt

1

除非fields是支持数字索引的Array对象,否则没有fields[0],因此您不能像那样获取它的名称。但是您可以通过以下方式模拟它:

function getKey(obj, i) {
    var j = 0;
    for (var p in obj) {
        if (j++ == i) return p;
    }
    return null;
}

for (var p in obj) 会循环遍历对象 obj 中的每个字段名。通过获取第 n 个字段名,您可以有效地获取某个索引的“键”。

请注意,虽然它正在努力成为标准,但目前不保证字段名称的顺序符合标准,这意味着在修改对象后,同一函数调用理论上可能返回不同的字段名称。同样的情况也适用于不同的浏览器可能返回不同的结果。实际上,您会发现几乎所有的浏览器都会保留字段名称的顺序,因此您不必担心它。


循环是否按照定义的顺序迭代? - Thilo
请查看我刚刚添加到答案中的文本。 - Blixt
实际上,你会发现几乎所有的浏览器都会保持字段名称的顺序。即使你添加更多的字段? - Thilo
随着对象的修改,新的字段名称将被添加到列表末尾。 - Blixt

1
只是指出其他人回答中隐含的内容:“Javascript中的关联数组”实际上就是Object实例,例如,
var aa = {};
aa.foo = 'argle';
alert(aa['foo']); // Will alert 'argle'

请不要使用Array代替Object——这可能会对for key in aa风格的迭代造成严重影响。


好观点。在太多的库(常用库!)中,我看到了这样的错误:做something = []something = new Array(),然后跟着something['key'] = 123。例如WMD(在SO上使用的实时Markdown编辑器)和jQuery UI。 - Blixt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接