Как перебрать массив объектов с помощью javascript?

Я пытаюсь зациклить массив, содержащий объекты, и все время получаю сообщение об ошибке: «Невозможно установить для свойства« цвет »значение undefined». Что я делаю неправильно?

var ObjectTest = function(something1, something2){
    this.Name = something1;
    this.Job = something2;
    this.color = '';
    this.numbers = [];
    
}

var first = new ObjectTest('Paul', 'teacher');
var second = new ObjectTest('Jane', 'doctor');
var third = new ObjectTest('Mike', 'student');

var someArray = [];
someArray.push(first, second, third);
console.info(someArray);


for(var i =0; i <= someArray.length; i++){
    someArray[i].color = 'red';
};

Ваш <= в петле должен быть <.

slider 10.10.2018 17:11

Должен быть i < someArray.length. Если в массиве 3 элемента, длина равна 3, а индексы - 0, 1 и 2.

Pointy 10.10.2018 17:11

Возможный дубликат Вложенный цикл for - массив undefined

Michelangelo 10.10.2018 17:13

Во-первых, спасибо, что разместили полезный фрагмент. Приведенные ниже ответы верны, но могу ли я предложить вам изучить инструменты отладки вашего браузера. Это позволило бы вам пройти через цикл элемент за элементом и увидеть все переменные и их значения. В свою очередь, это привело бы вас к решению.

Jeremy J Starcher 10.10.2018 17:27
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
71
4

Ответы 4

Вам нужно выполнять итерацию до тех пор, пока длина массива не будет превышена, потому что индексы основаны на нуле

for (var i = 0; i < someArray.length; i++) {
//                ^

Массив возвращает undefined для несуществующего элемента. undefined не имеет свойства присвоить новое значение.

var ObjectTest = function(something1, something2) {
        this.Name = something1;
        this.Job = something2;
        this.color = '';
        this.numbers = [];
    };

var first = new ObjectTest('Paul', 'teacher');
var second = new ObjectTest('Jane', 'doctor');
var third = new ObjectTest('Mike', 'student');

var someArray = [];
someArray.push(first, second, third);

for (var i = 0; i < someArray.length; i++) {
    someArray[i].color = 'red';
}                                            // no semicolon here

console.info(someArray);

Замените <= на < в вашем цикле.

В массиве всего 3 элемента, что означает, что у вас есть индексы 0, 1 и 2. Цикл должен остановиться, когда он достигнет 3. Но поскольку вы использовали <=, а не <, i <= 3, когда i - это 3, это true, таким образом выполняя код. Ошибка вызвана тем, что someArray[3] не существует.

Более безопасный способ обхода массивов без работы с индексами - использовать array.forEach. Он выполняет цикл столько раз, сколько элементов в массиве.

someArray.forEach((object, index) => {
  object.color = 'red'
})

<= был ронг

var ObjectTest = function(something1, something2){
    this.Name = something1;
    this.Job = something2;
    this.color = '';
    this.numbers = [];
    
}

var first = new ObjectTest('Paul', 'teacher');
var second = new ObjectTest('Jane', 'doctor');
var third = new ObjectTest('Mike', 'student');

var someArray = [];
someArray.push(first, second, third);


for(var i =0; i < someArray.length; i++){
    someArray[i].color = 'red';
};
console.info(someArray);

Более простой способ просмотреть массив - использовать метод forEach. Что-то вроде этого:

someArray.forEach(data =>  data.color = 'red');

Другие вопросы по теме