Как предусмотреть значение undefined в свойстве объекта внутри массива? (JS)
Всем привет! Есть массив из объектов, внутри объектов свойства с заданными значениями. Если есть значение - выводим шаблонную строку вида Ваш счет ${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();
Ответы (2 шт):
Автор решения: ksa
→ Ссылка
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 []
}
Автор решения: Lordar
→ Ссылка
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();