5 малоизвестных возможностей JSON.stringify()

от автора

Доброго времени суток, друзья!

В этой небольшой заметке я хочу рассказать вам о некоторых редко используемых возможностях JSON.stringify(). Возможно, они окажутся вам полезными.

JSON.stringify() часто используется при отладке для преобразования объекта или обычной строки в строку в формате JSON. Но как данный метод используется, и можем ли мы обойтись toString()? Давайте попробуем это сделать.

// создаем объект user const user = {     name: 'Harry Heman',     age: 29,     job: 'developer' }  // преобразуем объект в строку, используя стандартный метод toString(), и выводим результат в консоль console.log(user.toString()) // [object Object] 

[object Object] — это не совсем то, что мы хотели увидеть, не правда ли?

Не спрашивайте, зачем мы вообще используем toString(). Предположим, что нам жизненно необходимо перевести объект в строку.

Теперь попробуем использовать JSON.stringify():

console.log(JSON.stringify(user)) // {"name":"Harry Heman","age":29, "job": "developer"} 

Мы сделали это, Карл!

Однако возможности JSON.stringify() этим не исчерпываются.

1. Использование массива в качестве второго аргумента

Вы не ослышались, функция stringify может иметь второй аргумент. Этим аргументом является массив ключей объекта, который мы хотим отобразить в консоли. Допустим, у нас есть такой массив объектов:

let users = [     {         id: 1,         login: 'harry',         password: 'qwerty',         status: 'admin',         access: true     },     {         id: 2,         login: 'alice',         password: 'qwerty',         status: 'user'     },     {         id: 3,         login: 'bob',         password: 'qwerty',         status: 'user'     },     {         id: 4,         login: 'john',         password: 'qwerty',         status: 'user'     },     {         id: 5,         login: 'jane',         password: 'qwerty',         status: 'user'     } ] 

… и мы хотим увидеть, кто из пользователей является админом (у админа есть свойство «access»).

Если мы используем console.log(JSON.stringify(users)), то получим следующее:

[{"id":1,"login":"harry","password":"qwerty","status":"admin", "access": true},{"id":2,"login":"alice","password":"qwerty","status":"user"},{"id":3,"login":"bob","password":"qwerty","status":"user"},{"id":4,"login":"john","password":"qwerty","status":"user"},{"id":5,"login":"jane","password":"qwerty","status":"user"}] 

Согласитесь, не очень читабельно.

Теперь попробуем сделать следующее:

console.log(JSON.stringify(users, ['id', 'access'])) // [{"id":1,"access":true},{"id":2},{"id":3},{"id":4},{"id":5}] 

Так намного лучше.

Справедливости ради надо отметить, что в данном случае мы могли бы использовать console.table(users):

… но мы говорим о JSON.stringify(), поэтому не отвлекаемся. Пример не очень хороший, но, думаю, идея понятна.

2. Использование функции в качестве второго аргумента

Функция в качестве второго аргумента stringify оценивает каждую пару ключ-значение согласно логике данной функции. Если мы возвращаем undefined, то соответствующая пара ключ-значение не отображается. Пример:

const result = JSON.stringify(users, (key, value) => {     if (typeof value === 'string') return undefined      return value })  console.log(result) // [{"id":1,"access":true},{"id":2},{"id":3},{"id":4},{"id":5}] 

3. Использование числа в качестве третьего параметра

Третий аргумент отвечает за пробелы. Если таким аргументом является число, то каждый уровень строки будет иметь соответствующий отступ:

console.log(JSON.stringify(user, null, 2)) 

Получаем следующее:

{   "name": "Harry Heman",   "age": 29,   "job": "developer" } 

4. Использование строки в качестве третьего аргумента

Если третьим параметром является строка, то вместо пробелов будут использованы символы этой строки:

console.log(JSON.stringify(user, null, '->')) 

Получаем следующее:

{ ->"name": "Harry Heman", ->"age": 29, ->"job": "developer" } 

5. Метод toJSON

Метод toJSON может быть свойством любого объекта. JSON.stringify() возвращает результат этой функции без преобразования всего объекта:

const user = {     first: 'Harry',     last: 'Heman',     age: 29,     toJSON(){         return {             full: `${this.first} ${this.last}`         }     } }  console.log(JSON.stringify(user)) // "full": "Harry Heman" 

Бонус

Кроме JSON.stringify() и toJSON(), существует также метод json(), возвращающий обещание (промис). Данный метод используется в запросах на сервер.

Пример использования:

const url = 'https://jsonplaceholder.typicode.com/users'  asyncAwaitFetch() async function asyncAwaitFetch(){     try {         const response = await fetch(url)         const data = await response.json()         console.table(data)     } catch (error){         console.error(error)     } finally {         console.log('потрачено')     } } 

Получаем следующее:

Благодарю за внимание.

Счастливого кодинга!

ссылка на оригинал статьи https://habr.com/ru/post/491252/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *