Skip to content
This repository has been archived by the owner on May 5, 2020. It is now read-only.

Latest commit

 

History

History
48 lines (36 loc) · 1.85 KB

File metadata and controls

48 lines (36 loc) · 1.85 KB

Работа с потенциально несуществующими данными

Задача: записать в переменную значение вложенного на несколько уровней свойства какого-либо объекта. Загвоздка в том, что этот объект может быть пустым. В таком случае в переменную нужно установить значение по умолчанию.

Велик соблазн начать вручную проверять существование каждого уровня вложенности:

let loadedComments = null;

fetch('...')
	.then((response) => response.json())
	.then((response) => {
		if (response.result && response.result.user && response.result.user.comments) {
			loadedComments = response.result.user.comments;
		} else {
			loadedComments = [];
		}
	});

Такой способ работает, но в нём много дублирования кода и в целом он многословный.

Более лаконичная альтернатива без дублирования кода:

let loadedComments = null;

fetch('...')
	.then((response) => response.json())
	.then((response) => {
		loadedComments = ((response.result || {}).user || {}).comments || [];
	});

Обновление от 29.04.2020: optional chaining

В ECMAScript 2020 появился оператор optional chaining, решающий эту задачу гораздо более удобно:

let loadedComments = null;

fetch('...')
  .then((response) => response.json())
  .then((response) => {
    loadedComments = response.result?.user?.comments || [];
  });