在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中的这种情况吗?
答案 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
绑定到全局上下文,这是真正想要避免的。