我有一个被视为关联数组的JavaScript对象。我们称之为“领域”。它有几个要素,例如:
fields['element1'] = ...
fields['element2'] = ...
fields['element3'] = ...
给定字段[0],是否可以获取属性的名称(即“element1”)而不是其值?
答案 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 = {};”表示法,并且必须通过其属性访问。当然,地图是地图,没有订购是有保证的。
阵列的创建方式不同,即使它们可以作为地图访问,也只能通过索引访问它们,以确保维护顺序。
点是:
答案 1 :(得分:8)
不,有两个原因。
你可以遍历属性:
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
式迭代造成严重破坏。