Как перебрать свойства объектов в массиве

Рейтинг: 2Ответов: 1Опубликовано: 20.01.2023

Задача: Мне нужно перебрать student и runLab которые находятся в объектах, а объекты находятся в массиве arrayOfObjects.

Проблема: Код выдает ошибку

mainScript.js:37 Uncaught TypeError: elementMethod.runLab is not a function
    at mainScript.js:37:41
    at Array.forEach (<anonymous>)
    at gradeLabs (mainScript.js:35:11)
    at mainScript.js:43:1

Пытался решить никак не могу. Подскажите как исправить ошибку чтобы код работал нормально.

const arrayOfObjects = [
    {
        student: 'Dmitriy',
        runLab () {
            return 1;
        }
    },
    {
        student: 'Andrew',
        runLab () {
            return 2;
        }
    },
    {
        student: 'Mellisa',
        runLab () {
            return 3;
        }
    },
    {
        student: 'Ann',
        runLab () {
            return 4;
        }
    },
];
function gradeLabs(array,expectedResult) {
    array.forEach((elementName,elementFunc) => {
        const resultName = elementName.student;
        const resultLab = elementFunc.runLab();
        if (resultLab === expectedResult) {
            console.log('Student has PASSED the test',resultName);
        }
    });
}
gradeLabs(arrayOfObjects,1);

Ответы

▲ 1Принят

Все что вам надо сделать, это заменить elementFunc на elementName. Т.к. вы пытались вызвать метод .runLab у числа(индекс текущего элемента):

const resultLab = elementName.runLab();

Потому что у метода массива forEach 3 параметра - текущий элемент, индекс массива и сам массив

.forEach(function (item, index, array) {})

Полный код:

const arrayOfObjects = [
  {
    student: 'Dmitriy',
    runLab () {
      return 1;
    }
  },
  {
    student: 'Andrew',
    runLab () {
      return 2;
    }
  },
  {
    student: 'Mellisa',
    runLab () {
      return 3;
    }
  },
  {
    student: 'Ann',
    runLab () {
      return 4;
    }
  },
];
function gradeLabs(array,expectedResult) {
  array.forEach((elementName) => {
    if (elementName.runLab() === expectedResult) {
      console.log('Student has PASSED the test', elementName.student);
    }
  });
}
gradeLabs(arrayOfObjects,2);

Хотя я бы рекомендовал вам для поиска 1 элемента массива воспользоваться методом .find или циклом for(т.к. при нахождении желаемого элемента, дальнейший перебор можно прервать).