Самый чистый способ назначить с оценкой короткого замыкания на нескольких условиях - PullRequest
1 голос
/ 11 марта 2020

Я пытаюсь построить объект JSON на основе данных, которые есть у клиента под рукой.

В идеале он будет выбирать данные адреса, если они доступны, а затем данные корзины, если они недоступны, в противном случае - ноль.

Здесь данные извлекаются из localStorage, но я сталкиваюсь с проблемами, addresses и cart разрешают следующие ошибки, когда null.

Не удается прочитать свойство 'length' из null

Невозможно прочитать свойство 'idShipTo' из неопределенного

let cart = JSON.parse(localStorage.getItem('shopping-cart'));
let addresses = JSON.parse(localStorage.getItem('customer-address'));

this.request = {
  address: {
    shipToAddLine: addresses[0].shipToAddLine || cart.shipToAddLine || null,
    shipToCityStZip: addresses[0].shipToCityStZip || cart.shipToCityStZip || null
  }
}

Я хотел бы использовать что-то вроде троичного оператора, но использовать более одного значения if / else.

this.request = {
  address: {
    shipToAddLine: (addresses) ? addresses[0].shipToAddLine || (cart) ? cart.shipToAddLine || null,
    shipToCityStZip: (addresses) ? addresses[0].shipToCityStZip || (cart) ? cart.shipToCityStZip || null
  }
}

Возможно ли это с использованием чистого (однострочного) синтаксиса в JS, или мне нужно помещать назначения в блоки if / else?

let shipToAddLine;
if (addresses) shipToAddLine = addresses[0].shipToAddLine;
else if (cart) shipToAddLine = cart.shipToCityStZip;
else shipToAddLine = null;

et c ...

Ответы [ 2 ]

1 голос
/ 11 марта 2020

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

let cart = JSON.parse(localStorage.getItem('shopping-cart')) || {};
let addresses = JSON.parse(localStorage.getItem('customer-address')) || [{}];

this.request = {
  address: {
    shipToAddLine: addresses[0].shipToAddLine || cart.shipToAddLine || null,
    shipToCityStZip: addresses[0].shipToCityStZip || cart.shipToCityStZip || null
  }
}

Если корзина пуста, она инициализируется пустым объектом, а если адрес пуст, изначально инициализируется массивом, имеющим пустой объект Тогда вам не понадобятся чеки до addresses[0].shipToAddLine и cart.shipToAddLine

1 голос
/ 11 марта 2020

Можно связать троичных операторов

    shipToAddLine: addresses ? addresses[0].shipToAddLine : (cart ? cart.shipToAddLine : null),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...