Переводчик: Front-end Xiaozhi
оригинал:JavaScript kicks.com/articles/23…
Чем больше вы знаете, тем больше вы не знаете
Ставьте лайк и смотрите снова, формируйте привычку
эта статьяГитхаб:GitHub.com/QQ449245884…Он был включен в вышеизложенное, и более ранние статьи с высокими похвалами были классифицированы, а также было систематизировано множество моих документов и учебных материалов. Добро пожаловать в Star and Perfect. Вы можете обратиться в тестовый центр для ознакомления во время собеседования. Надеюсь, у нас что-то получится вместе.
Чтобы обеспечить удобочитаемость, в этой статье используется вольный перевод, а не дословный перевод.
JavaScript — удивительная вещь. Но некоторые вещи в JavaScript действительно странные и запутанные. Один из них, когда вы пытаетесь получить доступ к вложенным объектам, вы получаете эту ошибку
Cannot read property 'foo' of undefined
В большинстве случаев, имея дело с вложенными объектами, обычно нам нужно безопасно получить доступ к самому внутреннему вложенному значению. Вот кукуруза:
const user = {
id: 101,
email: 'jack@dev.com',
personalInfo: {
name: 'Jack',
address: {
line1: 'westwish st',
line2: 'washmasher',
city: 'wallas',
state: 'WX'
}
}
}
когда мы хотим посетитьuser
внутриname
а такжеcity
const name = user.personalInfo.name;
const userCity = user.personalInfo.address.city;
user
серединаpersonal
недоступен, структура объекта будет такой:
const user = {
id: 101,
email: 'jack@dev.com'
}
Теперь, если вы пытаетесь получить доступname
Вы получитеCannot read property 'name' of undefined
ошибка.
const name = user.personalInfo.name; // Cannot read property 'name' of undefined
Это потому, что мы пытаемся получить доступ к ключу в объектеname
характеристики.
const name = user && user.personalInfo ? user.personalInfo.name : null;
let city;
if (
data && data.user && data.user.personalInfo &&
data.user.personalInfo.addressDetails &&
data.user.personalInfo.addressDetails.primaryAddress
) {
city = data.user.personalInfo.addressDetails.primaryAddress;
}
const name = ((user || {}).personalInfo || {}).name;
Используя эту нотацию, никогда не сталкивайтесь с непрочитанным свойством undefined"name
Подход заключается в том, чтобы проверить, существует ли пользователь, и, если нет, создать пустой объект, таким образом ключи к следующему уровню всегда будут доступны из существующего объекта.
К сожалению, вы не можете использовать этот навык для посещения.Вложенный массив.
Доступ к вложенным объектам с уменьшением массива
Метод уменьшения массива очень мощный и может использоваться для безопасного доступа к вложенным объектам.
const getNestedObject = (nestedObj, pathArr) => {
return pathArr.reduce((obj, key) =>
(obj && obj[key] !== 'undefined') ? obj[key] : null, nestedObj);
}
// 将对象结构作为数组元素传入
const name = getNestedObject(user, ['personalInfo', 'name']);
// 要访问嵌套数组,只需将数组索引作为数组元素传入。.
const city = getNestedObject(user, ['personalInfo', 'addresses', 0, 'city']);
// 这将从 addresses 中的第一层返回 city
Typy
Если вы считаете, что приведенный выше метод слишком нестандартен, вы можете использовать библиотеку Typy. Помимо безопасного доступа к вложенным объектам, он может делать много интересных вещей.
При использованииTypy, код будет выглядеть так
import t from 'typy';
const name = t(user, 'personalInfo.name').safeObject;
const city = t(user, 'personalInfo.addresses[0].city').safeObject;
// address is an array
Вот некоторые другие библиотеки, такие какLodash
а такжеRamda
, может это сделать. Но в легковесном фронтенд-проекте, особенно если вам нужен только один-два метода из этих библиотек, лучше выбрать другую легковесную библиотеку, либо написать свою.
Коммуникация (приглашаем вступить в группу, группа будет присылать красные конверты по рабочим дням, технология интерактивного обсуждения)
Статьи из серии галантерейных товаров резюмируются следующим образом: если вы чувствуете себя хорошо, нажмите «Звезда», добро пожаловать в группу, чтобы учиться друг у друга.
Я Сяо Чжи, автор официального аккаунта "Moving the World",Продолжайте знакомить энтузиастов с передовыми технологиями. Я буду часто делиться тем, что я узнал и увидел, На пути продвижения, давайте подбадривать друг друга!
Обратите внимание на публичный аккаунт и отвечайте в фоновом режимеБлагосостояние, вы можете увидеть преимущества, вы знаете.