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

71 голос | спросил DisgruntledGoat 24 MarpmWed, 24 Mar 2010 19:26:26 +03002010-03-24T19:26:26+03:0007 2010, 19:26:26

10 ответов


0

Вам нужно вызвать 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 };
ответил SLaks 24 MarpmWed, 24 Mar 2010 19:29:28 +03002010-03-24T19:29:28+03:0007 2010, 19:29:28
0

Строковые ключи можно запрашивать с помощью Object.keys(array)

ответил thSoft 15 Jam1000000amWed, 15 Jan 2014 05:24:29 +040014 2014, 05:24:29
0

Если вы проводите какие-либо манипуляции с массивами /коллекциями или проверяете их, я настоятельно рекомендую использовать Underscore.js . Это небольшой, хорошо протестированный и избавит вас от головной боли JavaScript дней /недель /лет. Вот его функция клавиш:

Клавиши

Получить все имена свойств объекта.

_.keys({one : 1, two : 2, three : 3});
=> ["one", "two", "three"]
ответил Mike McKay 8 22011vEurope/Moscow11bEurope/MoscowTue, 08 Nov 2011 22:17:59 +0400 2011, 22:17:59
0
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]]);
}

edit , может быть, я весь здесь мокрый ...

ответил Pointy 24 MarpmWed, 24 Mar 2010 19:29:13 +03002010-03-24T19:29:13+03:0007 2010, 19:29:13
0

Скажите, что ваш массив выглядел как 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"]

ответил Morten 1 TueEurope/Moscow2015-12-01T14:59:18+03:00Europe/Moscow12bEurope/MoscowTue, 01 Dec 2015 14:59:18 +0300 2015, 14:59:18
0
widthRange.map(function(_, i) { return i });

или

widthRange.map((_, i) => i);
ответил alexndreazevedo 9 J0000006Europe/Moscow 2016, 17:33:41
0

Ваш оригинальный пример прекрасно работает для меня:

<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
ответил Andy Shellam 24 MarpmWed, 24 Mar 2010 19:31:23 +03002010-03-24T19:31:23+03:0007 2010, 19:31:23
0

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

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 />");
}
ответил Michael D. Irizarry 24 MarpmWed, 24 Mar 2010 19:35:30 +03002010-03-24T19:35:30+03:0007 2010, 19:35:30
0

Я написал функцию, которая прекрасно работает с каждым экземпляром Objects (таковы массивы).

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 ]

Это может быть полезно для всех.

ответил schwarzkopfb 2 J0000006Europe/Moscow 2012, 20:06:54
0

... ????

Кроме того, если у вас есть список элементов, которые вы хотите использовать ...

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(''));

    }
ответил Yann Carter 13 FebruaryEurope/MoscowbThu, 13 Feb 2014 19:02:05 +0400000000pmThu, 13 Feb 2014 19:02:05 +040014 2014, 19:02:05

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132