Как получить ключи массива в Javascript?
У меня есть массив, созданный с помощью этого кода:
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)
, но это дает мне целую кучу дополнительных свойств (я предполагаю, что они являются функциями объекта). Я не могу использовать регулярный цикл, поскольку значения не являются последовательными.
Ответы
Ответ 1
Вам нужно вызвать функцию hasOwnProperty
, чтобы проверить, действительно ли свойство определено на самом объекте (в отличие от его прототипа), вот так:
for (var key in widthRange) {
if (key === 'length' || !widthRange.hasOwnProperty(key)) continue;
var value = widthRange[key];
}
Обратите внимание, что вам нужна отдельная проверка для length
.
Однако вы не должны использовать массив здесь вообще; вы должны использовать обычный объект. Все объекты 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 };
Ответ 2
Строковые ключи можно запросить с помощью Object.keys(array)
.
Ответ 3
Если вы делаете какие-либо манипуляции или проверку массива/коллекции, я настоятельно рекомендую использовать Underscore.js. Он небольшой, проверенный и сэкономит вам дни/недели/годы головной боли в JavaScript. Вот его функция:
Клавиши
Получить все имена свойств объекта.
_.keys({one : 1, two : 2, three : 3});
=> ["one", "two", "three"]
Ответ 4
for (var i = 0; i < widthRange.length; ++i) {
if (widthRange[i] != null) {
// do something
}
}
Вы не можете получить только ключи, которые вы установили, потому что это не то, как работает массив. После того, как вы установите элемент 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]]);
}
изменить, возможно, я здесь все мокрый...
Ответ 5
Скажите, как выглядит ваш массив
arr = [ { a: 1, b: 2, c: 3 }, { a: 4, b: 5, c: 6 }, { a: 7, b: 8, c: 9 } ]
(или, возможно, другие клавиши), вы можете сделать
arr.map((o) => {
return Object.keys(o)
}).reduce((prev, curr) => {
return prev.concat(curr)
}).filter((col, i, array) => {
return array.indexOf(col) === i
});
["a", "b", "c"]
Ответ 6
widthRange.map(function(_, i) { return i });
или
widthRange.map((_, i) => i);
Ответ 7
Ваш оригинальный пример отлично подходит для меня:
<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
Ответ 8
Я думаю, вы должны использовать Object ({}
), а не массив ([]
) для этого.
С каждым ключом связан набор данных. Он кричит об использовании объекта. У:
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]);
}
Ответ 9
Кажется, работает.
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 />");
}
Ответ 10
Я написал функцию, которая отлично работает с каждым экземпляром объектов (массивы - это те).
Object.prototype.toArray = function()
{
if(!this)
{
return null;
}
var c = [];
for (var key in this)
{
if ( ( this instanceof Array && this.constructor === Array && key === 'length' ) || !this.hasOwnProperty(key) )
{
continue;
}
c.push(this[key]);
}
return c;
};
Использование:
var a = [ 1, 2, 3 ];
a[11] = 4;
a["js"] = 5;
console.log(a.toArray());
var b = { one: 1, two: 2, three: 3, f: function() { return 4; }, five: 5 };
b[7] = 7;
console.log(b.toArray());
Вывод:
> [ 1, 2, 3, 4, 5 ]
> [ 7, 1, 2, 3, function () { return 4; }, 5 ]
Это может быть полезно для всех.
Ответ 11
...????
В качестве альтернативы, если у вас есть список элементов, которые вы хотите использовать...
var range = [46, 66, 90]
, widthRange=[]
, write=[];
widthRange[46] = { min:0, max:52 };
widthRange[66] = { min:52, max:70 };
widthRange[90] = { min:70, max:94 };
for(var x=0; x<range.length; x++){var key, wr;
key = range[x];
wr = widthRange[key] || false;
if(wr===false){continue;}
write.push(['key: #',key, ', min: ', wr.min, 'max:', wr.max].join(''));
}