Как получить ключи массива в 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) но это дает мне целый набор дополнительных свойств (я предполагаю, что они - функции на объекте). Я не могу использовать постоянного клиента для цикла, так как значения не последовательны.

72
задан DisgruntledGoat 26 November 2012 в 15:50
поделиться

5 ответов

Вам необходимо вызвать функцию 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 };
95
ответ дан 24 November 2019 в 12:31
поделиться

Ваш исходный пример мне подходит:

<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 + "; &nbsp;&nbsp;&nbsp; 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
1
ответ дан 24 November 2019 в 12:31
поделиться

Я думаю, вам следует использовать для этого объект ( {} ), а не массив ([]).

С каждым ключом связан набор данных. Он кричит об использовании объекта. Сделайте:

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]);
}
1
ответ дан 24 November 2019 в 12:31
поделиться

Кажется, работает.

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 />");
}
0
ответ дан 24 November 2019 в 12:31
поделиться
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 ну, может быть, я весь мокрый здесь ...

3
ответ дан 24 November 2019 в 12:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: