遍历对象哈希表

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 并在尝试之前测试成员是否存在使用它。 您将 arraysobjects 混淆了。 @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&lt;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.keyshasOwnProperty 是一个昂贵的电话【参考方案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)) … 会更好。

以上是关于遍历对象哈希表的主要内容,如果未能解决你的问题,请参考以下文章

哈希表遍历的顺序问题

hash表原理

c#用foreach遍历数组、列表时是直接获得数据元素,而foreach哈希表时,为啥获得的是命名空间名??

数据结构之哈希表

哈希表在遍历链式结构中的运用--以链表和二叉树的遍历为例

VBA编程,遍历文件夹下的excel表,对每个excel表遍历做一些操作