Как получить ключи массива в Javascript? - PullRequest
72 голосов
/ 24 марта 2010

У меня есть массив, созданный с этим кодом:

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, поскольку значения не являются последовательными.

Ответы [ 11 ]

94 голосов
/ 24 марта 2010

Вам необходимо вызвать функцию 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 };
70 голосов
/ 15 января 2014

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

17 голосов
/ 08 ноября 2011

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

Ключи

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

_.keys({one : 1, two : 2, three : 3});
=> ["one", "two", "three"]
3 голосов
/ 24 марта 2010
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 ну, может быть, я весь здесь мокрый ...

2 голосов
/ 09 июня 2016
widthRange.map(function(_, i) { return i });

или

widthRange.map((_, i) => i);
2 голосов
/ 01 декабря 2015

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

1 голос
/ 24 марта 2010

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

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

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 марта 2010

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

<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
0 голосов
/ 13 февраля 2014

... ????

Либо, если у вас есть список предметов, которые вы хотите использовать ...

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

    }
0 голосов
/ 02 июня 2012

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

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 ]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...