Как уменьшить это, если проверка оператора в JavaScript - PullRequest
0 голосов
/ 26 октября 2018

Как я могу уменьшить это, если утверждение в JavaScript

if(obj.attributes && obj.attributes.email === 'test@test.com') { ... }

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Строка сама по себе понятна, однако, если вы ищете способ написать меньше оператора && внутри, вы всегда можете поместить вещи вне сравнения, такие как.

var attributes = obj.attributes || {};
if ( attributes.email === 'test@test.com' ) {
}

Это имеет смыслесли вам нужно сделать несколько проверок вместо одной, но если это одно сравнение, то кажется, что код, который у вас уже есть, в порядке, поскольку вы проверяете, определен ли attributes перед доступом к свойству undefined.

С другой стороны, если у вас есть поддержка ES 2015, вы можете уничтожить такие вещи, как:

const { attributes = {} } = obj;
if ( attributes.email === 'test@test.com' ) {
}
0 голосов
/ 26 октября 2018

Вы можете создать повторно используемую функцию get, используя Array.reduce().Параметры функции - это путь, объект и defaultValue (по умолчанию defaultValue равно undefined).Он будет перебирать путь и попытаться извлечь значение, в случае неудачи он вернет defaultValue:

const get = (path, obj, defaultValue) => obj ? 
  path.reduce((r, k) => r && typeof r === 'object' ? r[k] : defaultValue, obj) 
  : 
  defaultValue;

if(get(['attributes', 'email'], null) === 'test@test.com') { console.log(1) }
if(get(['attributes', 'email'], {}) === 'test@test.com') { console.log(2) }
if(get(['attributes', 'email'], { attributes: {} }) === 'test@test.com') { console.log(3) }
if(get(['attributes', 'email'], { attributes: { email: 'test@test.com' } }) === 'test@test.com') { console.log(4) }

Имеется предложение на этапе TC39, которое называется "Необязательная цепочка для JavaScript" .Если он перейдет на язык, он добавит дополнительный оператор цепочки - ?.Теперь, если attributes не существует, он вернет undefined.

Пример: obj.attributes? .Email

Сегодня его можно использовать через плагин babel .

...