Обращение к новому массиву, полученному в результате работы цикла

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

Всем привет! Есть массив testArr из объектов (данные банковских счетов). Мне нужно для дальнейшей работы с ним с помощью цикла создать новый массив newArr, в который попадут только ОТКРЫТЫЕ счета. Создаю с помощью цикла:

for(let i = 0; i <= testArr.length; i++) {
if(testArr[i].StatusDesc === "Открытый вклад") {
    newArr.push(testArr[i]);
    }

}

В дальнейшем хочу работать с получившимся массивом newArr за пределами цикла for, например, с помощью условного оператора.

if(newArr.length > 1) {
elem1 = "";
elem2 = -1;
result.push(elem1, elem2);

}

Но за пределами цикла for новый массив newArr как будто бы не существует. При попытке вывести в консоль result получаю ошибку:

введите сюда описание изображения

Что за ошибка связана со свойством объекта в массиве "StatusDesc", по которому идет отбор в новый массив? Ведь массив все-таки создается? Но почему с ним невозможна дальнейшая работа?

Ответы

▲ -1Принят

У вас цикл, создающий массив падает в ошибку, конечно дальше ничего происходить не будет.

Сама же ошибка указывает на отсутствие в массиве элемента StatusDesc. Либо там такого вообще нет, либо иногда нет. Во втором случае надо обернуть проверку значением по умолчанию, либо добавить '?' для подавления ошибки.

Однако, сдаётся мне, что ошибка возникает по другой причине, ибо чтение несуществующего элемента даёт просто undefined, а ошибка свидетельствует о том, что у несуществующего элемента пытаются посмотреть следующую глубину вложенности свойств (скорей всего из-за цикла за пределами массива). Тем не менее покажу в вашем примере как обходить подобные ошибки.

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

let newArr=[];

//for(let i = 0; i <= testArr.length; i++) {
//Неверно!! Нет у массива элемента testArr.length, на один раньше остановиться надо

for(let i = 0; i < testArr.length; i++) {
    //Значение по умолчанию.
    //Однако, если не существует testArr[i] (что внутри нашего цикла невозможно),
    //на будущее знайте, ошибка вылезет всё равно.
    if( (testArr[i].StatusDesc || '') === "Открытый вклад") {
        newArr.push(testArr[i]);
    }

    //Подавление ошибки
    if( testArr[i]?.StatusDesc === "Открытый вклад") {
        newArr.push(testArr[i]);
    }    

    //Подавление ошибки и значение по умолчанию
    if( (testArr[i]?.StatusDesc || '') === "Открытый вклад") {
        newArr.push(testArr[i]);
    }

}

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

testArr?.[5]?.StatusDesc?.substring(1,2)

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

▲ 1

в указанном условии

for(let i = 0; i <= testArr.length; i++) {

последнее значение i - равно testArr.length, что больше максимального индекса, поэтому обращение testArr[i] возвращает undefined.

При попытке обратиться к полю и показывается ошибка.

Из-за ошибки выполнение кода прерывается.

Поэтому получается, что массив заполняется нормально, но до дальнейшей проверки дело не доходит

Для решения достаточно исправить условие

for(let i = 0; i < testArr.length; i++) {