如何在Javascript中使用无序索引遍历对象

5
我正在创建一个播放列表系统,每首歌曲都有一个唯一的ID。当你将一首歌曲添加到播放列表数组中时,它的索引就被注册为它的ID。
通常情况下,在循环javascript数组时,您会获取长度并通过索引递增。是否有一种方法可以循环未使用索引的数组?这样做是否有任何不良实践的原因?

所有的 JavaScript 数组都是关联数组,你不需要使用计数索引。 - Perception
@TomalakGeret'kal 如果您查看您指定的链接并继续查看答案中给出的链接,您会进入此页面:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array 请查看“长度和数字属性之间的关系”标题。它似乎是非常明确的行为规范。 - Jonathan
@Jonathan:看起来.length[]之间确实有联系,所以我错了。但是我最初的观点是Array具有连续的数字索引,这一点仍然成立。事实上,.length会自动增加以“适应”新的更高整数键,这只能进一步证明这一点。 - Lightness Races in Orbit
1
@TomalakGeret'kal 回想起来,我想指出这场辩论对我非常有帮助。我学到了很多以前不知道的关于Javascript的知识。感谢你的“推波助澜”。 - Jonathan
@TomalakGeret'kal Jonathan在这里是正确的,只是缺少一些细节,也许需要一个http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.pdf链接到ECMA标准。第88页是重要的部分。Javascript数组是将属性[0..2^32]特殊处理的对象,并维护一个名为length的属性。如果您使用特殊属性分配给数组,它将适当地增加长度。完全标准,并在所有JS引擎中实现相同。一切都是对象(EIAS),对象是映射。 - David Souther
显示剩余12条评论
4个回答

5
var obj = {"123": "Lalala",
           "456": "dum dum"};
for(var i in obj){
    //i = ID
    // obj[i] = "song"
}

使用for(var i in obj)循环遍历对象。请查看上面的注释以理解此for语句的含义。

顺便说一下,您所说的是对象,而不是数组:

var array = [7, 5, 9];

您可以通过这种方式模拟数组,以便可以使用 for(var i=0; i<array_like.length; i++)。除非您定义它,否则无法对其使用数组函数(例如 pop):

var array_like = {0:7, 1:5, 2:9, length:3};

非常感谢。For...in 看起来像是我的解决方案。还要感谢您纠正我。 - c..
这在这种情况下并不重要,但在使用for...in的一般方法时不要忘记检查hasOwnProperty。 - David Souther

4
你可以通过两种方式访问对象的属性。一种是使用“.”,例如:
var my prop = obj.property;

或通过括号表示法:

var my prop = obj["property"];

现在,这并没有完全回答你的问题。以下是几种方法:
利用jQuery的each函数:
$.each(obj, function(key, value){
    //Do something with your key and value.
});

使用JavaScript编写函数:

for(var key in obj)
{
    var value = obj[key];
    //Do something with your key and value.
}

希望这有所帮助!

谢谢。使用for...in似乎是正确的方法。不过有一点需要注意:使用jQuery的$.each与使用常规的for循环的行为方式相同,它将从0开始计数并逐步增加到其长度。 - c..

0

您也可以使用for each来仅迭代属性值:

var obj = {"key1": "val1",
           "key2": "val2"};

for each(var value in obj) {
    ....
}

但在这种情况下,您无法访问属性名称。


-1 表示错误的关键字,只需要使用“for”,不需要使用“each”。 - David Souther
有两种for循环:'for' -- 遍历索引,和 'for each' -- 遍历值。但是,在旧版本的IE中不支持'for each'。你认为这是不正确的关键字吗? - timestopper
"for each" 是 Mozilla 特有的语言扩展,与 ECMA 标准中提供的 "for ... in" 语法相比,几乎没有任何优势,并且在所有当前的 JS 引擎中都可用。 - David Souther

-1
假设您的数组以以下形式存在:
array['id1'] = 'val1';
array['id2'] = 'val2';
array['id3'] = 'val3';

您可以使用以下方式迭代值:

for (var id in array) {  
  document.write(id + ' – ' + array[id]);
} 

那不能是一个数组,而应该是一个对象。 - Lightness Races in Orbit

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