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

时间:2009-08-07 10:32:35

标签: javascript arrays

我有一个被视为关联数组的JavaScript对象。我们称之为“领域”。它有几个要素,例如:

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

给定字段[0],是否可以获取属性的名称(即“element1”)而不是其值?

4 个答案:

答案 0 :(得分:19)

假设您有一个对象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中,所有对象,包括数组,都是关联容器”)。

您通常需要两种容器:地图和阵列。

如上例所示创建地图(使用“o = new Object();”或“o = {};”表示法,并且必须通过其属性访问。当然,地图是地图,没有订购是有保证的。

阵列的创建方式不同,即使它们可以作为地图访问,也只能通过索引访问它们,以确保维护顺序。

点是:

  • 如果您需要地图,请使用“new Object()”容器
  • 如果您需要数组,而不是数组,请使用“new Array()”容器
  • 不要混淆两者,不要通过索引访问地图,对于数组,总是通过索引访问数据,因为如果你不遵循这些原则,你就不会得到什么你想要的。

答案 1 :(得分:8)

不,有两个原因。

  1. fields [0]和fields [“element1”]是不同的属性。
  2. 对象中的属性显式无序
  3. 你可以遍历属性:

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

    ...为任何可能随时改变的“第一”任意值获取“第一”属性。

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

答案 2 :(得分:1)

没有fields[0](除非fields是一个Array对象,它支持数字索引),所以你不能得到它的名字。但你可以像这样模拟它:

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 字段名称,您可以有效地获取某个索引的“密钥”。

请注意,虽然它正在成为一种标准,但目前根据标准无法保证字段名称的顺序,这意味着在修改对象之后,理论上相同的函数调用可以返回不同的字段名称。同样的事情是不同的浏览器可以返回不同的结果。实际上,你会发现几乎所有的浏览器都保留了字段名称的顺序,所以你根本不必担心它。

答案 3 :(得分:1)

只是要指出其他人的答案中隐含的内容:Javascript中的“关联数组”实际上只是Object个实例,例如,

var aa = {};
aa.foo = 'argle';
alert(aa['foo']); // Will alert 'argle'

请不要使用Array而不是Object - 它有可能对for key in aa式迭代造成严重破坏。