如何获取存储在对象中的键的数组值" for in"在JavaScript中循环

时间:2014-07-13 01:07:16

标签: javascript

在Javascript中,我希望有一个具有三个属性的对象," zone1"," zone2"," zone3&#34 ;,每个属性存储一系列地名。我想通过遍历数组来查找地名来搜索匹配。 以下问题几乎让我在那里,但不适合我,因为我没有使用jQuery,我想要的是价值,而不是关键:

我的代码如下所示:

var zoneArray = {};
zoneArray["zone1"] = ["placeA", "placeB"];
zoneArray["zone2"] = ["placeC", "placeD"];

function getZone(place, zoneArray) {
    var zone;
    for (var key in zoneArray) {
        for(i = 0; i<key.length; i++) {
            if(key[i] == place) {
                zone = key;
                return zone;
            }
        }
    }

}
getZone("placeC", climateZoneArray);
然而,显然,&#34;键[i]&#34;是指区域名称的字母,例如&#34; z&#34; &#34; O&#34; &#34; N&#34; &#34; E&#34;

有人可以帮助我理解或最好地处理Javascript中的这种情况吗?

2 个答案:

答案 0 :(得分:4)

使用zoneArray[key]访问阵列。

for (var key in zoneArray) {
    var arr = zoneArray[key]
    for(i = 0; i<arr.length; i++) {
        if(arr[i] == place) {
            zone = key;
            return zone;
        }
    }
}

答案 1 :(得分:0)

使用for ... in迭代对象的属性可能会产生一些非常令人惊讶的结果,特别是如果您在已扩展Object.prototype的环境中工作。这是因为for ... in将遍历对象可枚举属性包含在该对象原型链中的可枚举属性。如果这不是您想要的但是您将使用for ... in,那么建议在循环顶部使用条件语句检查属性是否属于对象正在迭代。 (if (!foo.hasOwnProperty(x)) continue;)。幸运的是,有Object.keys()。您可以使用Object.keys()来获取对象数组拥有的可枚举属性,如果这样做,您可以跳过hasOwnProperty丑陋。不是迭代对象,而是迭代它的数组键。

var collection = {
    zone1: ['placeA', 'placeB'],
    zone2: ['placeC', 'placeD']
};

function getZone(needle, collection) {
    var zones = Object.keys(collection),
        found;
    for (var i = 0, l = zones.length; i < l; i++) {
        found = collection[zones[i]].filter(function(place) {
            return needle == place;
        });
        if (found.length > 0) {
            return zones[i];
        }
    }
};

console.log(getZone('placeC', collection));

这也是jsfiddle.net上的here

最后一点,在创建变量时要非常小心,在内部for循环中,您创建变量i而不使用var关键字。这导致i绑定到全局上下文,这是真正想要避免的。