Skip to content

Commit 9f9a5c1

Browse files
committed
[LES-17.10/st-compl] format-json
Practice with "JSON.stringify/parse()" meth's, param's "replacer/space". Worth noting: - possibilities/purpose of the "replacer" function in the "JSON.stringify()" method. FS-dev: B-3 / JS basic
1 parent 808b857 commit 9f9a5c1

File tree

2 files changed

+110
-0
lines changed

2 files changed

+110
-0
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
4+
<head>
5+
<meta charset="UTF-8">
6+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
7+
<title>DOM - practice</title>
8+
<script src="./practice.js" defer></script>
9+
</head>
10+
11+
<body>
12+
</body>
13+
14+
</html>
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
'use strict';
2+
3+
// Задание 1:
4+
// Представь, что ты делаешь веб-приложение, в котором пользователь может выбрать тему (светлую или тёмную) и язык интерфейса. Эти настройки нужно сохранять в браузере, чтобы при следующем визите они не сбрасывались.
5+
// Напиши две функции:
6+
// 1. saveSettings(settingsObj): Эта функция принимает объект с настройками (например, { theme: 'dark', language: 'ru' }) и сохраняет его в localStorage под ключом appSettings.
7+
// 2. loadSettings(): Эта функция должна загружать настройки из localStorage, парсить их обратно в объект и возвращать его. Если в localStorage по ключу appSettings ничего нет, функция должна вернуть пустой объект {}.
8+
9+
function saveSettings(settingsObj = {}) {
10+
localStorage.setItem('appSettings', JSON.stringify(settingsObj));
11+
}
12+
13+
saveSettings({}); // {}
14+
saveSettings({ theme: 'dark', language: 'ru' }); // {"theme":"dark","language":"ru"}
15+
16+
function loadSettings() {
17+
const storageSettings = JSON.parse(localStorage.getItem('appSettings'));
18+
19+
if (!storageSettings) {
20+
return {};
21+
}
22+
23+
return storageSettings;
24+
}
25+
26+
const loadResult = loadSettings();
27+
console.log(loadResult); // {theme: 'dark', language: 'ru'}
28+
29+
// Задание 2:
30+
// У тебя есть объект с данными пользователя, который содержит как публичную, так и приватную информацию.
31+
// Напиши функцию getPublicProfileJSON(userObject), которая принимает такой объект и возвращает его в виде красиво отформатированной JSON-строки (с отступами). Однако в этой строке не должно быть полей email и passwordHash.
32+
// Подсказка: Вспомни про второй и третий аргументы JSON.stringify(). Они здесь очень пригодятся.
33+
34+
const user = {
35+
id: 101,
36+
username: 'admin',
37+
38+
passwordHash: 'a1b2c3d4e5f6...', // Секретный хэш
39+
lastLogin: new Date(),
40+
settings: {
41+
notifications: true,
42+
theme: 'dark',
43+
},
44+
};
45+
46+
function getPublicProfileJSON(userObject = {}) {
47+
return JSON.stringify(
48+
userObject,
49+
['id', 'username', 'lastLogin', 'settings', 'notifications'],
50+
2
51+
);
52+
}
53+
54+
console.log(getPublicProfileJSON(user));
55+
/*
56+
{
57+
"id": 101,
58+
"username": "admin",
59+
"lastLogin": "2025-09-29T07:28:52.745Z",
60+
"settings": {
61+
"notifications": true,
62+
}
63+
}
64+
*/
65+
66+
// ?? пример продвинутого применения
67+
function getNewPublicProfileJSON(userObject) {
68+
const replacer = (key, value) => {
69+
if (key === 'passwordHash') {
70+
return undefined; // Это полностью уберёт ключ из JSON
71+
}
72+
if (key === 'email') {
73+
return '[REDACTED]'; // А это - заменит значение
74+
}
75+
if (typeof value === 'number') {
76+
return String(value); // Превратит число в строку
77+
}
78+
return value; // Все остальные значения оставляем как есть
79+
};
80+
81+
return JSON.stringify(userObject, replacer, 2);
82+
}
83+
84+
console.log(getNewPublicProfileJSON(user));
85+
/*
86+
{
87+
"id": "101",
88+
"username": "admin",
89+
"email": "[REDACTED]",
90+
"lastLogin": "2025-09-29T07:35:05.000Z",
91+
"settings": {
92+
"notifications": true,
93+
"theme": "dark"
94+
}
95+
}
96+
*/

0 commit comments

Comments
 (0)