Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
38 / 14 / 4
Регистрация: 28.01.2020
Сообщений: 170

Replacer для JSON-преобразования

19.05.2020, 16:37. Показов 2933. Ответов 8
Метки json (Все метки)

Студворк — интернет-сервис помощи студентам
В одном из онлайн учебников по JS cтолкнулся с такой задачей:

"В простых случаях циклических ссылок мы можем исключить свойство, из-за которого они возникают, из сериализации по его имени.

Но иногда мы не можем использовать имя, так как могут быть и другие, нужные, свойства с этим именем во вложенных объектах. Поэтому можно проверять свойство по значению.

Напишите функцию replacer для JSON-преобразования, которая удалит свойства, ссылающиеся на meetup:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
let room = {
  number: 23
};
 
let meetup = {
  title: "Совещание",
  occupiedBy: [{name: "Иванов"}, {name: "Петров"}],
  place: room
};
 
// цикличные ссылки
room.occupiedBy = meetup;
meetup.self = meetup;
 
alert( JSON.stringify(meetup, function replacer(key, value) {
  /* ваш код */
}));
 
/* в результате должно быть:
{
  "title":"Совещание",
  "occupiedBy":[{"name":"Иванов"},{"name":"Петров"}],
  "place":{"number":23}
}
*/
Решение ее приводится такое:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
let room = {
  number: 23
};
 
let meetup = {
  title: "Совещание",
  occupiedBy: [{name: "Иванов"}, {name: "Петров"}],
  place: room
};
 
room.occupiedBy = meetup;
meetup.self = meetup;
 
alert( JSON.stringify(meetup, function replacer(key, value) {
  return (key != "" && value == meetup) ? undefined : value;
}));
 
/*
{
  "title":"Совещание",
  "occupiedBy":[{"name":"Иванов"},{"name":"Петров"}],
  "place":{"number":23}
}
*/
Я не понимаю, почему ее нельзя решить например так:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
let room = {
  number: 23
};
 
let meetup = {
  title: "Совещание",
  occupiedBy: [{ name: "Иванов" }, { name: "Петров" }],
  place: room
};
 
room.occupiedBy = meetup;
meetup.self = meetup;
 
console.log(JSON.stringify(meetup, function replacer(key, value) {
  return (key  && value == meetup) ? "Привет" : value;//Зачем проверять key =="" ? ЧТОБЫ РАБОТАЛА НАДО "Привет" заменить на undefined. "Привет" написан, чтобы разобраться, что возвращает replacer
}, 2));
 
/* результат ведь одинаков (если вместо "Привет" подставить undefined:
{
  "title":"Совещание",
  "occupiedBy":[{"name":"Иванов"},{"name":"Петров"}],
  "place":{"number":23}
}
*/
Подскажите, пожалуйста, что я не понимаю?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.05.2020, 16:37
Ответы с готовыми решениями:

Как написать конвертор для преобразования json в текст?
Как написать подобный конвектор для преобразования json в текст? https://www.browserling.com/tools/json-to-text

Создание сложной структуры данных для преобразования их в JSON
Запрашиваю из БД данные (из нескольких таблиц), соответственно количество выбранных строк из таблиц заранее не известно. в JSON нужно...

Java, JSON и JSON Simple. Непонятка с созданием объекта JSON на сервере для отправки на фронт
Здравствуйте. Разрабатываю интернет-магазин на Java. Мне нужно на фронте получить список товаров из базы данных для отображения на...

8
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
19.05.2020, 18:09
Цитата Сообщение от Alborki Посмотреть сообщение
Подскажите, пожалуйста, что я не понимаю?
Цитата Сообщение от Alborki Посмотреть сообщение
ачем проверять key =="" ?
Цитирую то, что Вы не прочитали - https://developer.mozilla.org/... /stringify
Цитата Сообщение от MDN
The replacer parameter
.....
Initially, the replacer function is called with an empty string as key representing the object being stringified. It is then called for each property on the object or array being stringified.
............
If you return a Function, Symbol, or undefined, the property is not included in the output.
1
38 / 14 / 4
Регистрация: 28.01.2020
Сообщений: 170
19.05.2020, 19:35  [ТС]
Речь идет об обертке?
Но все-равно мне в данной ситуации проверка key =="" представляется избыточной.
Ведь ключ передается как строка.

Условие для проверки может быть и таким (key && value == meetup).
Нет?
0
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
19.05.2020, 20:05
Alborki,
Цитата Сообщение от Alborki Посмотреть сообщение
Речь идет об обертке?
Цитата Сообщение от Alborki Посмотреть сообщение
key ==""
??????
Я честно говоря даже растерялся...
Дословно следуя документации
key !="" - выключит из проверки сам объект, который в реплейсере представляется как пустая строка, поэтому и нужен undefined. То есть избежать лишних действий. Вы этого не увидите. Это происходит под капотом.

Можно просто глянуть на результат в консоли.

JavaScript
1
2
3
4
5
return (key != "" && value == meetup) ? undefined : value;
// {"title":"Совещание","occupiedBy":[{"name":"Иванов"},{"name":"Петров"}],"place":{"number":23}}
 
return (key  && value == meetup) ? "Привет" : value;
//{"title":"Совещание","occupiedBy":[{"name":"Иванов"},{"name":"Петров"}],"place":{"number":23,"occupiedBy":"Привет"},"self":"Привет"}
0
38 / 14 / 4
Регистрация: 28.01.2020
Сообщений: 170
19.05.2020, 20:08  [ТС]
Просто так тоже работает:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
let room = {
  number: 23
};
 
let meetup = {
  title: "Совещание",
  occupiedBy: [{ name: "Иванов" }, { name: "Петров" }],
  place: room
};
 
room.occupiedBy = meetup;
meetup.self = meetup;
 
console.log(JSON.stringify(meetup, function replacer(key, value) {
  return (key  && value == meetup) ? undefined : value; //Зачем проверять key =="" ? 
}, 2));
 
/* результат ведь одинаков 
{
  "title":"Совещание",
  "occupiedBy":[{"name":"Иванов"},{"name":"Петров"}],
  "place":{"number":23}
}
*/
0
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
19.05.2020, 20:20
Alborki, работает, но результат не одинаков. Я продемонстрировал выше.
0
38 / 14 / 4
Регистрация: 28.01.2020
Сообщений: 170
19.05.2020, 20:26  [ТС]
Извините, но какая разница в результате между этим:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
let room = {
  number: 23
};
 
let meetup = {
  title: "Совещание",
  occupiedBy: [{ name: "Иванов" }, { name: "Петров" }],
  place: room
};
 
room.occupiedBy = meetup;
meetup.self = meetup;
 
console.log(JSON.stringify(meetup, function replacer(key, value) {
  return (key  && value == meetup) ? undefined : value; //Зачем проверять key =="" ? 
}, 2));
 
/* 
{
  "title":"Совещание",
  "occupiedBy":[{"name":"Иванов"},{"name":"Петров"}],
  "place":{"number":23}
}
*/
и этим:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
let room = {
  number: 23
};
 
let meetup = {
  title: "Совещание",
  occupiedBy: [{ name: "Иванов" }, { name: "Петров" }],
  place: room
};
 
room.occupiedBy = meetup;
meetup.self = meetup;
 
console.log(JSON.stringify(meetup, function replacer(key, value) {
  return (key ==""  && value == meetup) ? undefined : value; //Зачем проверять key =="" ? 
}, 2));
 
/* 
{
  "title":"Совещание",
  "occupiedBy":[{"name":"Иванов"},{"name":"Петров"}],
  "place":{"number":23}
}
*/
0
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
19.05.2020, 20:32
Alborki, простите и Вы меня, но я начинаю сомневаться в Вашем зрении
Миниатюры
Replacer для JSON-преобразования  
0
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
19.05.2020, 20:55
Лучший ответ Сообщение было отмечено Alborki как решение

Решение

Так, попробую по-другому - https://codepen.io/qwerty_wasd/pen/PoPXZeW
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
let room = {
  number: 23
};
 
let meetup = {
  title: "Совещание",
  occupiedBy: [{ name: "Иванов" }, { name: "Петров" }],
  place: room
};
 
room.occupiedBy = meetup;
meetup.self = meetup;
 
// нет такого поля ""  потому и вывод undefined
// он в рекурсию даже не войдет
console.log(`key == ""  -> ${JSON.stringify(meetup, function replacer(key, value) {
  return (key == "" && value == meetup) ? undefined : value;
}, 2)}`);
 
// пустая строка для типизации JS булев 0
// то есть "" == false
// пустого поля нет, значит проверку проходит
// то есть просто будет проверяться его наличие, но undefined все-равно выключит объект из рекурсии
console.log(`key -> ${JSON.stringify(meetup, function replacer(key, value) {
  return (key && value == meetup) ? undefined : value;
}, 2)}`);
 
// проверяем, чтобы в пролверку не вошел САМ ОБЪЕКТ, и вернем undefined  для верности
console.log(`key != ""  -> ${JSON.stringify(meetup, function replacer(key, value) {
  return (key !="" && value == meetup) ? undefined : value;
}, 2)}`);
 
// тут undefined  не возвращается из калбека
// и поля, наличие которых Вы просто проверяете, существуют
// сам объект войдет в рекурсивный обход, плюс произойдет замена объекта на Привет.
console.log(`Привет -> ${JSON.stringify(meetup, function replacer(key, value) {
  return (key  && value == meetup) ? "Привет" : value;
}, 2)}`);
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.05.2020, 20:55
Помогаю со студенческими работами здесь

Ошибка преобразования json строки в объект C#
Не обращайте внимание , что все свойства типа string , это я потом поменяю. public class OrderBook { public string...

Вирус в doc файлах MW97:Replacer Очень нужно восстановить файлы!
При открытии doc-файла ругается Avast на вирус MW97:Replacer-A. И предлагает он этот файл только удалить либо переместить в карантин, а...

Ошибка при обработке Json - Cannot deserialize the current JSON array because the type requires a JSON object
Дополнительные сведения: Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1'...

Ошибка при обработке Json - Cannot deserialize the current JSON array because the type requires a JSON object
Всем привет! Помогите, плиз, разобраться с ошибкой: An unhandled exception of type 'Newtonsoft.Json.JsonSerializationException'...

Программа для преобразования
Прошу помощи с написанием такой программы: Составить программу для преобразования двоичного 16-ти разрядного числа, находящегося в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru