Javascript: перебор массива с непоследовательными ключами - PullRequest
7 голосов
/ 30 января 2012

Мне нужно перебрать массив, для которого ключи не являются последовательными:

var messages = new Array();
messages[0] = "This is the first message";
messages[3] = "This is another message";

Очевидно, что использование индекса для цикла for не будет работать, поскольку оно зависит от последовательности ключей:

for (var i=0 ; i<messages.length ; i++) {
    alert(messages[i]); // Will only alert the first message, as i is never equal to 3
}

Каков канонический способ решения этой проблемы, поскольку синтаксис for-each не предназначен для перебора значений в массиве в javascript ? Спасибо.

Ответы [ 7 ]

10 голосов
/ 30 января 2012

Идиоматическим способом было бы использовать объект, а не массив.Просто убедитесь, что вы отметили hasOwnProperty, чтобы убедиться, что вы не подбираете случайные вещи, которые могли быть добавлены в прототип.

var messages = { };
messages[0] = "This is the first message";
messages[3] = "This is another message";

for (var i in messages) {
    if (messages.hasOwnProperty(i))
        alert(messages[i]); 
}

Или, более современный способ будет использовать Object.keys

Object.keys(messages).forEach(prop => {
    alert(messages[prop]);
});

Обязательно передайте этот код с Babel, если вы планируете запускать его в более старомбраузеры, такие как IE.

4 голосов
/ 30 января 2012
for(var i in messages)
{
    console.log(messages[i]);
}
3 голосов
/ 30 января 2012

Вы можете игнорировать свойства undefined ...

for (var i=0 ; i<messages.length ; i++) {
    if(messages[i] !== undefined)
        alert(messages[i]);
}

Или использовать forEach, что будет игнорировать undefined необъявленные свойства ...

messages.forEach(function(v,i) {
    alert(v);
});
2 голосов
/ 04 февраля 2016

Simple! если массив имеет регулярные промежутки между индексами, сделайте это:

for (var i = 0 ; i < messages.length; i += gap) {
    alert(messages[i]); // Will only alert the messages at the regular interval/gap 
}
1 голос
/ 30 января 2012

Когда вы создаете массив и присваиваете ему значения в 0 и 3, undefined значения создаются в 1 и 2.попробуйте это:

$.each(messages, function(i,val) { 
  if (val) {
    alert(val);
  } 
});
1 голос
/ 30 января 2012

Вы можете использовать each() jQuery метод для этого.

$.each(messages, function(index, val){
    alert(val); 
});

Из документов JQuery

each()

Общая функция итератора, которую можно использовать для бесшовной итерации. над обоими объектами и массивами. Массивы и массоподобные объекты с свойство length (например, объект аргументов функции) повторяется по числовому индексу от 0 до длины-1. Другие объекты повторяются через их именованные свойства.

0 голосов
/ 22 июня 2016

Для случая использования, такого с допущениями:

array.length >== 1 (т.е. массив уже содержит значимые данные)

Где вас интересуют данные array[1], array[15], array[45] и т. Д.

Вы можете сделать что-то похожее на:

var array = ["you","will","become","strong","with","the","codes","padawan"];
var values = [1,5,7];


for (var i = 0; i < values.length; i++){
    var cypher = values[i];
    console.log(array[cypher]);
}
//will, the, padawan

Или, может быть, что-то более значимое, например:

for (var i = 0; i < values.length; i++){
    var cypher = values[i];
    aService.aFn.(array[cypher],cb);
}
//calls aService.aFn separately for each value array[1] , array[5] , array[7] passed as args
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...