Как предусмотреть значение undefined в свойстве объекта внутри массива? (JS)

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

Всем привет! Есть массив из объектов, внутри объектов свойства с заданными значениями. Если есть значение - выводим шаблонную строку вида Ваш счет ${newArr[0].DepInfo.AcctNum.slice(-4)} был открыт ${newArr[0].DepInfo.StartDt}. НО! Нужно предусмотреть, если не будет StartDt. Тогда нужно вывести пустую строку "", но у меня где-то ошибка и получаю "Ваш счет 5413 был открыт ".

Проверяю StartDt следующим образом:

newArr[0].DepInfo.StartDt !== undefined || newArr[0].DepInfo.StartDt !== null || newArr[0].DepInfo.StartDt !== ""

    let testArr = [
       {
        "StatusDesc": "Открытый вклад",
        "AccType": "Карта",
        "AcctCur": "RUR",
        "AcctName": "Платёжный счёт (руб.)",
        "itemInfo":
        {
            "StartDt": "",
            "itemNum": "775656566665413"
        }
    },
{
    "StatusDesc": "Вклад закрыт",
    "AccType": "Счет",
    "AcctCur": "RUR",
    "AcctName": "Накопительный счёт",
    "DepInfo": {
        "StartDt": "2022-09-07",
        "AcctNum": "775656566665413",
    }
},
];

// Отбираем для работы только открытые счета в массив newArr

let newArr = [];

// Создаем результирующий массив result

let result = [];

// Куда будем складывать искомые значения (строку и код выполнения функции) в переменные elem1 и elem2

let elem1;
let elem2;

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

    if(newArr.length > 1 || newArr.length === 0) {
        elem1 = "";
        elem2 = -1;
        result.push(elem1, elem2);
    } else {
            if(newArr[0].hasOwnProperty("DepInfo")) {
                if(/^\d+$/.test(newArr[0].DepInfo.AcctNum) && (newArr[0].DepInfo.StartDt !== undefined || newArr[0].DepInfo.StartDt !== null || newArr[0].DepInfo.StartDt !== "")) {
                        elem1 = `Ваш счет ${newArr[0].DepInfo.AcctNum.slice(-4)} был открыт ${newArr[0].DepInfo.StartDt}`;
                        elem2 = 0;
                        result.push(elem1, elem2);
                } else {
                        elem1 = "";
                        elem2 = -1;
                        result.push(elem1, elem2);                 
                }
            } else if(newArr[0].hasOwnProperty("itemInfo")) {
                if(/^\d+$/.test(newArr[0].itemInfo.itemNum) && (newArr[0].itemInfo.StartDt !== undefined || newArr[0].itemInfo.StartDt !== null || newArr[0].itemInfo.StartDt !== "")) {
                        elem1 = `Ваш счет ${newArr[0].itemInfo.itemNum.slice(-4)} был открыт ${newArr[0].itemInfo.StartDt}`;
                        elem2 = 0;
                        result.push(elem1, elem2);
                } else {
                        elem1 = "";
                        elem2 = -1;
                        result.push(elem1, elem2);
                }
            }  
    }
}

opnAcctRes();

Ответы

▲ 0Принят

let testArr = [{ // если не диномичный, лучше const
"StatusDesc": "Открытый вклад",
"AccType": "Карта",
"AcctCur": "RUR",
"AcctName": "Платёжный счёт (руб.)",
"ItemInfo": { // уникальный ???
    "StartDt": "",
    "ItemNum": "775656566665413" // уникальный ???
}
}, {
"StatusDesc": "Вклад закрыт",
"AccType": "Счет",
"AcctCur": "RUR",
"AcctName": "Накопительный счёт",
"DepInfo": { // уникальный ???
    "StartDt": "2022-09-07",
    "AcctNum": "775656566665413" // уникальный ???
}
}]; // по возможности ключи следует матчить или описывать все используемые (тут логика не понятна)

function opnAcctRes() {
let newArr = testArr.filter(arr => arr.StatusDesc === 'Открытый вклад'); // надежнее проверять число, а не строку
if (newArr.length !== 1) return ['', -1]; // странная проверка допускающая только один элемент??? было в вопросе - оставил  
return newArr.map((item, index, array) => { // шарим по всем вкладам, подозреваю что их будет больше одного 
    let {StartDt, AcctNum, ItemNum} = item?.DepInfo || item?.ItemInfo || {}, num = AcctNum ?? ItemNum; // деструктуризация
    return (isFinite(num) && StartDt) ? ['Ваш счет '+ num.slice(-4) +' был открыт '+ StartDt, 0] : ['', -1]; // /^\d+$/.test()
}).flat(); // для одного можно pop() или распаковку result сделать
};

// result = opnAcctRes();

▲ 0

newArr[0].DepInfo.StartDt !== undefined || newArr[0].DepInfo.StartDt !== null || newArr[0].DepInfo.StartDt !== ""

Вместо этого, применительно к дате, можно написать

if (newArr[0]?.DepInfo?.StartDt) {
   // тут значение даты будет определено и не будет пустой строкой или нулем
}

Более подробнее про оператор ?. тут https://metanit.com/web/javascript/4.18.php

let testArr = [{
    "StatusDesc": "Открытый вклад",
    "AccType": "Карта",
    "AcctCur": "RUR",
    "AcctName": "Платёжный счёт (руб.)",
    "itemInfo": {
      "StartDt": "",
      "itemNum": "775656566665413"
    }
  },
  {
    "StatusDesc": "Вклад закрыт",
    "AccType": "Счет",
    "AcctCur": "RUR",
    "AcctName": "Накопительный счёт",
    "DepInfo": {
      "StartDt": "2022-09-07",
      "AcctNum": "775656566665413",
    }
  },
];

// Отбираем для работы только открытые счета в массив newArr

const newArr = testArr.filter(({StatusDesc}) => StatusDesc === "Открытый вклад")
const result = opnAcctRes();
console.log(result)

function opnAcctRes() {
  if (newArr.length !== 1) return ['', -1]
  const o = newArr[0].DepInfo ?? newArr[0].itemInfo
  if (o) {
    const ok = /^\d+$/.test(o.AcctNum)
    if (ok && o.StartDt) {
      const n = o.AcctNum.slice(-4)
      return [`Ваш счет ${n} был открыт ${o.StartDt}`, 0]
    }
    return ['', -1]
  }
  return []
}