遍历对象哈希表
Posted
技术标签:
【中文标题】遍历对象哈希表【英文标题】:Iterating through an object hashtable 【发布时间】:2012-04-21 04:23:45 【问题描述】:我正在尝试使用哈希表,以便选择存储在数组/对象中的特定对象。但是,我在循环对象时遇到问题。
var pins= ;
pins[6] = '6';
pins[7] = '7';
pins[8] = '8';
$('#result3').append('<div>Size: ' + Object.size(pins) + '</div>');
for(var i = 0; i < Object.size(pins); i++)
$('#result3').append('<div>' + pins[i] + '</div>');
JSFiddle:http://jsfiddle.net/7TrSU/
正如您在TEST 3
中看到的那样,它使用对象pin
来存储数据,我在循环对象pin
时得到undefined
。
循环通过pin
的正确方法是什么?
编辑
如果我不只是 pin[6] = '6'
,而是让 pin[6] = 一个对象,并且我想遍历它们的所有 id
属性,会发生什么?我正在做的实际代码 sn-p...
for(var i = 0; i < json.length; i++)
markerId = json[i].listing_id
// Place markers on map
var latLng = new google.maps.LatLng(json[i].lat, json[i].lng);
var marker = new google.maps.Marker(
listing_id: markerId,
position: latLng,
icon: base_url + 'images/template/markers/listing.png',
);
markers[markerId] = marker;
for(var marker in markers)
console.log('marker ID: ' + marker.listing_id);
mc.addMarker(marker);
上面的console.log
返回未定义,如果我改为使用console.log(marker)
,我得到marker.listing_id
的值。对不起,我越来越糊涂了!
我设法让它与$.each(markers, function(i, marker));
一起工作,但为什么上面的for..in
不起作用?
【问题讨论】:
您在索引 6、7 和 8 处添加成员,但从 0 迭代到 2。更好的策略是从0
迭代到 length-1
并在尝试之前测试成员是否存在使用它。
您将 arrays 与 objects 混淆了。
@c69—数组是对象,;-) OP 的问题是试图访问不存在的属性。
@RobG 是的,这就是我赞成你的评论的原因))但他正试图访问不存在的属性,正是因为他不了解自己在做什么。
如果我不只是 pin[6] = '6'
,而是将 pin[6] = 一个对象,并且我想遍历它们的所有属性 id
,会发生什么?更新了原帖。
【参考方案1】:
var hash =
hash[key] = value
Object.keys(hash).forEach(function (key)
var value = hash[key]
// iteration code
)
【讨论】:
value变量使用后创建。【参考方案2】:不要使用for(i=0; i<size; i++)
循环。相反,使用:
Object.keys(pins)
获取属性列表并循环遍历它,或者
将for ( key_name in pins)
与Object.hasOwnProperty
结合使用(排除继承属性)以循环访问属性。
您的第三个测试用例的问题是它读取键 0、1 和 2(而不是 6、7、8)的值。
【讨论】:
【参考方案3】:由于您使用的是 jQuery:
jQuery.each(pins, function (name, value)
$('#result3').append('<div>' + name + "=" + value + '</div>');
);
【讨论】:
我使用了你的方法,它按我想要的方式工作,但我不明白为什么使用for..in
不能按预期工作...更新原始帖子...
因为您使用for..in
来计算项目的数量,而不是找出它们的名称。一旦你发现有三个项目,你会查看名为 0、1 和 2 的项目,但这些项目被称为 6、7 和 8。【参考方案4】:
试试这个:
for (var pin in pins)
$('#result3').append('<div>' + pin + '</div>');
Example fiddle
【讨论】:
for ... in 循环是次优的 @Raynos 不,他们不是。但是,没有hasOwnProperty
。
@c69 for ... in
仍然不是最理想的,因为它的性能不如Object.keys
。 hasOwnProperty
是一个昂贵的电话【参考方案5】:
function iterate(obj)
var keys = Object.keys(obj);
for(i in keys)
doSomething(obj[keys[i]].id);
这会遍历任何对象中所有字段的id
【讨论】:
【参考方案6】:pin
以 6 到 8 开头,但 for 循环从 0 到 3(对象的长度)循环。您需要从 6 循环到 6 + the_size_of_the_object
。像这样的:
for(var i = 6, len = 6 + Object.size(pins); i < len; i++)
$('#result3').append('<div>' + pins[i] + '</div>');
或者类似的,这是我喜欢的:
for( var i = 5; pin = pins[++i]; )
$('#result3').append('<div>' + pin + '</div>');
【讨论】:
如果您在尝试使用该成员清除不存在的成员之前添加if (pin.hasOwnProperty(i)) …
会更好。以上是关于遍历对象哈希表的主要内容,如果未能解决你的问题,请参考以下文章