Мне создали массив с этим кодом:
var widthRange = new Array();
widthRange[46] = { min:0, max:52 };
widthRange[66] = { min:52, max:70 };
widthRange[90] = { min:70, max:94 };
Я хочу получить каждое из значений 46, 66, 90 в цикле. Я попробовал for (var key in widthRange)
но это дает мне целый набор дополнительных свойств (я предполагаю, что они - функции на объекте). Я не могу использовать постоянного клиента для цикла, так как значения не последовательны.
Вам необходимо вызвать функцию hasOwnProperty
, чтобы проверить, действительно ли свойство определено в самом объекте (в отличие от его прототипа), например:
for (var key in widthRange) {
if (key === 'length' || !widthRange.hasOwnProperty(key)) continue;
var value = widthRange[key];
}
Обратите внимание, что вам нужен отдельный проверьте длину
.
Однако здесь вообще не следует использовать массив; вам следует использовать обычный предмет. Все объекты Javascript функционируют как ассоциативные массивы.
Например:
var widthRange = { }; //Or new Object()
widthRange[46] = { sel:46, min:0, max:52 };
widthRange[66] = { sel:66, min:52, max:70 };
widthRange[90] = { sel:90, min:70, max:94 };
Ваш исходный пример мне подходит:
<html>
<head>
</head>
<body>
<script>
var widthRange = new Array();
widthRange[46] = { sel:46, min:0, max:52 };
widthRange[66] = { sel:66, min:52, max:70 };
widthRange[90] = { sel:90, min:70, max:94 };
var i = 1;
for (var key in widthRange)
{
document.write("Key #" + i + " = " + key + "; min/max = " + widthRange[key].min + "/" + widthRange[key].max + "<br />");
i++;
}
</script>
</html>
Результаты в браузере (Firefox 3.6.2 в Windows XP):
Key #1 = 46; min/max = 0/52
Key #2 = 66; min/max = 52/70
Key #3 = 90; min/max = 70/94
Я думаю, вам следует использовать для этого объект ( {}
), а не массив ([]
).
С каждым ключом связан набор данных. Он кричит об использовании объекта. Сделайте:
var obj = {};
obj[46] = { sel:46, min:0, max:52 };
obj[666] = { whatever:true };
// This is what for..in is for
for (var prop in obj) {
console.log(obj[prop]);
}
Может быть, вам могут помочь некоторые служебные программы:
window.WidthRange = (function () {
var obj = {};
return {
getObj: function () {return obj;}
, add: function (key, data) {
obj[key] = data;
return this; // enabling chaining
}
}
})();
// Usage (using chaining calls):
WidthRange.add(66, {foo: true})
.add(67, {bar: false})
.add(69, {baz: 'maybe', bork:'absolutely'});
var obj = WidthRange.getObj();
for (var prop in obj) {
console.log(obj[prop]);
}
Кажется, работает.
var widthRange = new Array();
widthRange[46] = { sel:46, min:0, max:52 };
widthRange[66] = { sel:66, min:52, max:70 };
widthRange[90] = { sel:90, min:70, max:94 };
for (var key in widthRange)
{
document.write(widthRange[key].sel + "<br />");
document.write(widthRange[key].min + "<br />");
document.write(widthRange[key].max + "<br />");
}
for (var i = 0; i < widthRange.length; ++i) {
if (widthRange[i] != null) {
// do something
}
}
Вы не можете получить только те ключи, которые вы установили, потому что Array работает не так. После того, как вы установили элемент 46, у вас также будет установлено значение от 0 до 45 (хотя они равны нулю).
У вас всегда может быть два массива:
var widthRange = [], widths = [], newVal = function(n) {
widths.push(n);
return n;
};
widthRange[newVal(26)] = { whatever: "hello there" };
for (var i = 0; i < widths.length; ++i) {
doSomething(widthRange[widths[i]]);
}
edit ну, может быть, я весь мокрый здесь ...