[{"data":1,"prerenderedAt":1325},["ShallowReactive",2],{"$fH22Az9S7lbipZVTlvB1cc25AHPUu_at0dH6KR0n9SVY":3,"$f-KhKwB8J0md5Q3U1oyqNCQbHxVpirjaanlJWCGo_ht4":103,"$fkVWEWXZHbLy86BhC78gDVDJ_00TY4k_DsdZD3Mz6ZO0":106,"$fqGwjmVbyPxmA5lnsLz9nF3m-ncS8WzLIlTsTA85cuZA":111,"$fVMSX_HWVzVkzv-u5ATHiOgClblPaIGZfXUn_Cq8LKn4":457,"$fw0tI3d-iV2W3zZtbRjyPNNRSgXGobrmwsMU7a1fynls":678,"mdc-d9zmjj-key":698,"mdc-b4fxwa-key":787,"mdc--gf4ib3-key":885,"mdc-68ahzi-key":1020,"mdc-ma17ee-key":1083,"mdc--ht8gj1-key":1207,"mdc-taneuo-key":1259,"mdc-swkk57-key":1284,"mdc-196744-key":1302},{"content":4,"livecodingContent":58,"type":93,"pageMeta":94},[5,9,13,17,20,24,27,31,34,38,41,45,48,52,55],{"id":6,"value":7,"isTypeH1":8},"1988","Для каждого вложенного объекта нужно добавить свойство level, которое равняется числу - номер вложенности",true,{"id":10,"value":11,"anchor":12,"isTypeH2":8},"4629","Теория и разбор","theory-and-walkthrough",{"id":14,"value":15,"anchor":16,"isTypeH3":8},"4676","Что считается объектом в этой задаче","what-counts-as-object",{"id":18,"value":19,"isTypeParagraph":8},"10658","Для задачи требуется добавлять `level` только тем значениям, которые являются вложенными объектами (обычными объектами), а не примитивами.  \nПрактичная проверка для “обычного объекта” в рамках задания: `value !== null && typeof value === \"object\" && !Array.isArray(value)`.\n\nПочему проверка именно такая:\n- `typeof value === \"object\"` отсеивает числа, строки, булевы значения, `undefined`, функции.\n- `value !== null` обязателен, так как `null` технически возвращает тип `\"object\"`, но по смыслу не является объектом с полями.\n- `!Array.isArray(value)` исключает массивы, так как по условию требуется работать с вложенными объектами, а не с коллекциями (если массивы тоже нужно обрабатывать, это условие можно убрать, но тогда изменится смысл задания).",{"id":21,"value":22,"anchor":23,"isTypeH3":8},"4677","Как обход “в глубину” присваивает level","depth-first-and-level",{"id":25,"value":26,"isTypeParagraph":8},"10659","`level` — это число, показывающее сколько “шагов вниз” сделано от корня до текущего объекта:\n- Дочерние объекты корня получают `level: 1`.\n- Их дочерние объекты получают `level: 2`.\n- И так далее.\n\nТекстовая схема для примера:\n```\nroot\n├─ a (level 1)\n│  ├─ d (level 2)\n│  │  └─ h = 4 (не объект)\n│  └─ e = 2 (не объект)\n├─ b = 1 (не объект)\n└─ c (level 1)\n   └─ f (level 2)\n      ├─ g = 3 (не объект)\n      └─ k (level 3)\n```\n\nРекурсивная идея:\n- Функция получает объект и текущий `level`.\n- Сначала (или в конце) записывается `obj.level = level`.\n- Затем перебираются свойства; если значение — объект, делается рекурсивный вызов с `level + 1`.\n\nИтеративная идея со стеком:\n- Вместо “вызова самой себя” данные о том, что нужно обработать позже, кладутся в массив `stack`.\n- Из `stack` по одному извлекаются задачи “обработать объект src, записывать в dst, с указанным level”.\n",{"id":28,"value":29,"anchor":30,"isTypeH3":8},"4678","Почему примитивам level не добавляется","why-no-level-for-primitives",{"id":32,"value":33,"isTypeParagraph":8},"10660","Примитивы (число, строка, булево значение, `undefined`, `null`) не имеют структуры “ключ → значение”, в которую логично добавлять `level`.  \nПоэтому на свойствах вида `b: 1`, `h: 4`, `e: 2`, `g: 3` никаких изменений не выполняется.",{"id":35,"value":36,"anchor":37,"isTypeH3":8},"4679","Мутация и немутирующий подход","mutation-vs-immutable",{"id":39,"value":40,"isTypeParagraph":8},"10661","При немутирующем подходе (Вариант 1 и 3) входной объект остаётся прежним, а результат строится заново. Это удобно, когда требуется предсказуемость и отсутствие побочных эффектов.  \nПри мутации (Вариант 2) функция изменяет входной объект напрямую, что может быть быстрее по памяти, но требует аккуратности в коде, где входной объект используется повторно.\n\nТаблица различий:\n| Вариант | Изменение входа | Глубокая вложенность | Расход памяти |\n|---|---|---|---|\n| 1 (рекурсия, новый объект) | Нет | Возможны ограничения стека | Выше |\n| 2 (рекурсия, in-place) | Да | Возможны ограничения стека | Ниже |\n| 3 (итерация, стек, новый объект) | Нет | Обычно устойчивее | Средний |",{"id":42,"value":43,"anchor":44,"isTypeH3":8},"4680","Частые крайние случаи и улучшения","edge-cases-and-improvements",{"id":46,"value":47,"isTypeParagraph":8},"10662","Пустой объект `{}` тоже является объектом, поэтому он должен получить `level` (как в примере `k: {}` → `k: { level: 3 }`).  \nЕсли во входных данных уже есть поле `level`, то приведённые решения перезапишут его корректным значением глубины (это часто ожидаемо, но при необходимости можно договориться о другом поведении).",{"id":49,"description":50,"titleAlert":51,"isTypeAlertWarning":8},"781","Если во входном объекте потенциально возможны циклические ссылки (например, `obj.a = obj`), рекурсивный и итеративный обход без защиты уйдёт в бесконечный цикл. Для защиты обычно добавляется `WeakSet` посещённых объектов.",null,{"id":53,"value":54,"isTypeParagraph":8},"10663","Пример защиты от циклов (немутирующий рекурсивный вариант):\n```\nfunction addlevelInObjSafe(input) {\n  const isPlainObject = (value) =>\n    value !== null && typeof value === \"object\" && !Array.isArray(value);\n\n  const seen = new WeakSet();\n\n  const walk = (node, level) => {\n    if (!isPlainObject(node)) return node;\n    if (seen.has(node)) return node; // или выбросить ошибку, в зависимости от требований\n    seen.add(node);\n\n    const out = {};\n    for (const [key, value] of Object.entries(node)) {\n      out[key] = isPlainObject(value) ? walk(value, level + 1) : value;\n    }\n    out.level = level;\n    return out;\n  };\n\n  const result = {};\n  for (const [key, value] of Object.entries(input)) {\n    result[key] = isPlainObject(value) ? walk(value, 1) : value;\n  }\n  return result;\n}\n```",{"id":56,"value":57,"isTypeParagraph":8},"10664","Кратко: необходимо выполнить обход объекта в глубину и добавлять `level` только тем значениям, которые являются вложенными обычными объектами (не `null` и не массив), увеличивая глубину на 1 при каждом входе во вложенность; это реализуется рекурсией (с мутацией или без) либо итеративно через стек.",{"id":59,"functionTestData":60,"functionName":89,"functionTemplateCode":90,"solution":91,"description":92},"429",[61,79],[62,73],[63],{"a":64,"b":68,"c":69},{"d":65,"e":67},{"h":66},4,2,1,{"f":70},{"g":71,"k":72},3,{},{"a":74,"b":68,"c":76},{"d":75,"e":67,"level":68},{"h":66,"level":67},{"f":77,"level":68},{"g":71,"k":78,"level":67},{"level":71},[80,85],[81],{"a":82,"b":68,"c":83},{"d":66},{"k":84},{},{"a":86,"b":68,"c":87},{"d":66,"level":68},{"k":88,"level":68},{"level":67},"addlevelInObj","function addlevelInObj(object) {\n    // ваш код здесь\n}","Нужно обойти объект на произвольную глубину и в каждый вложенный объект добавить числовое поле `level`, равное глубине (1 для объектов на первом уровне вложенности, 2 — для следующего и т.д.).  \nКорневой объект (переданный в функцию) в примерах не получает `level`, поэтому добавление начинается с его дочерних объектов.\n\n**Вариант 1** — рекурсия без мутации (возвращается новый объект)\n\nОсобенности:\n- Исходный объект не изменяется.\n- Удобно для “чистых” функций и предсказуемого поведения.\n\n```\nfunction addlevelInObj(input) {\n  const isPlainObject = (value) =>\n    value !== null && typeof value === \"object\" && !Array.isArray(value);\n\n  const walk = (node, level) => {\n    // На всякий случай: если сюда попало не то, что ожидалось\n    if (!isPlainObject(node)) return node;\n\n    const out = {};\n\n    // Копирование всех свойств с обработкой вложенных объектов\n    for (const [key, value] of Object.entries(node)) {\n      out[key] = isPlainObject(value) ? walk(value, level + 1) : value;\n    }\n\n    // level ставится в конце, чтобы гарантированно соответствовать глубине\n    out.level = level;\n    return out;\n  };\n\n  const result = {};\n  for (const [key, value] of Object.entries(input)) {\n    result[key] = isPlainObject(value) ? walk(value, 1) : value;\n  }\n  return result;\n}\n```\n\n**Вариант 2** — рекурсия с мутацией (изменяется исходный объект)\n\nОсобенности:\n- Быстрее по памяти (не создаются копии всех объектов).\n- Может быть нежелательно, если исходный объект нужен “как был”.\n\n```\nfunction addlevelInObj(input) {\n  const isPlainObject = (value) =>\n    value !== null && typeof value === \"object\" && !Array.isArray(value);\n\n  const walk = (node, level) => {\n    if (!isPlainObject(node)) return;\n\n    node.level = level;\n\n    for (const key of Object.keys(node)) {\n      const value = node[key];\n      if (isPlainObject(value)) walk(value, level + 1);\n    }\n  };\n\n  for (const key of Object.keys(input)) {\n    const value = input[key];\n    if (isPlainObject(value)) walk(value, 1);\n  }\n\n  return input;\n}\n```\n\nЭтот вариант меняет структуру объекта “на месте”, поэтому после вызова `addlevelInObjInPlace(object)` переменная `object` уже содержит `level`.\n\n**Вариант 3** — итеративно (без рекурсии), новый объект (стек)\n\nОсобенности:\n- Не использует рекурсию, значит меньше риск упереться в ограничение глубины стека вызовов.\n- Сохраняет “без мутации”: возвращается новый объект.\n\n```\nfunction addlevelInObjIterative(input) {\n  const isPlainObject = (value) =>\n    value !== null && typeof value === \"object\" && !Array.isArray(value);\n\n  const result = {};\n  const stack = [];\n\n  // Старт: обрабатываются дочерние значения корня\n  for (const [key, value] of Object.entries(input)) {\n    if (isPlainObject(value)) {\n      const childDst = {};\n      result[key] = childDst;\n      stack.push({ src: value, dst: childDst, level: 1 });\n    } else {\n      result[key] = value;\n    }\n  }\n\n  // DFS через явный стек\n  while (stack.length > 0) {\n    const { src, dst, level } = stack.pop();\n\n    for (const [key, value] of Object.entries(src)) {\n      if (isPlainObject(value)) {\n        const nextDst = {};\n        dst[key] = nextDst;\n        stack.push({ src: value, dst: nextDst, level: level + 1 });\n      } else {\n        dst[key] = value;\n      }\n    }\n\n    dst.level = level;\n  }\n\n  return result;\n}\n```","Дан объект:\n\n```\nconst object = {\n  a: {\n    d: {\n      h: 4,\n    },\n    e: 2,\n  },\n  b: 1,\n  c: {\n    f: {\n      g: 3,\n      k: {},\n    },\n  },\n};\n```\n\nНеобходимо для каждого вложенного объекта нужно добавить свойство level, которое равняется числу - номер вложенности. Если значение свойства будет не объект, то ничего не добавлять\n\nТо есть, функция `addlevelInObj(object)` принимает объект object, описаный выше и должна возвратить объект вида:\n```\n{\n  a: {\n    level: 1,\n    d: {\n      level: 2,\n      h: 4,\n    },\n    e: 2,\n  },\n  b: 1,\n  c: {\n    level: 1,\n    f: {\n      level: 2,\n      g: 3,\n      k: {\n        level: 3,\n      },\n    },\n  },\n}\n```\n\nПримеры:\n\n```\n// Параметр функции:\n{\n  a: {\n    d: {\n      h: 4,\n    },\n    e: 2,\n  },\n  b: 1,\n  c: {\n    f: {\n      g: 3,\n      k: {},\n    },\n  },\n}\n\n// Возвращаемое значение функции:\n{\n  a: {\n    level: 1,\n    d: {\n      level: 2,\n      h: 4,\n    },\n    e: 2,\n  },\n  b: 1,\n  c: {\n    level: 1,\n    f: {\n      level: 2,\n      g: 3,\n      k: {\n        level: 3,\n      },\n    },\n  },\n}\n```\n\n```\n// Параметр функции:\n{\n  a: {\n    d: 4,\n  },\n  b: 1,\n  c: {\n    k: {},\n  },\n}\n\n// Возвращаемое значение функции:\n{\n  a: {\n    level: 1,\n    d: 4,\n  },\n  b: 1,\n  c: {\n    level: 1,\n    k: {\n      level: 2,\n    },\n  },\n}\n```\n\nP.s. результаты функции и тестовых данных сравниваются с помощью результата оборачивания объектов в `JSON.stringify`, поэтому соблюдение порядка полей важно.","livecoding",{"title":95,"description":7,"ogTitle":95,"ogDescription":7,"ogImageUrl":96,"canonical":51,"ogLocale":97,"ogSiteName":98,"ogImageType":99,"ogImageWidth":100,"ogImageHeight":101,"ogType":102,"ogUrl":51},"Для каждого вложенного объекта нужно добавить свойство level","/og-image.png","ru_RU","goodwebjob.ru","image_jpeg","1200","630","article",{"siteName":104,"siteUrl":105},"GOOD WEB JOB!","https://goodwebjob.ru",[107],{"label":108,"slug":109,"to":110},"Подготовка к тех.интервью","technical-interview","/technical-interview/where-to-begin",{"navigationList":112,"navigationSublist":121},[113,117],{"path":110,"isActive":114,"name":115,"icon":116,"isNavbarMobileDisabled":8},false,"С чего начать?","material-symbols:visibility-outline-rounded",{"path":118,"isActive":8,"name":119,"icon":120,"isNavbarMobileDisabled":114},"/technical-interview/tasks","Сборник задач","material-symbols:task-outline",[122,131,158,170,176,316,340,349,355,418,439,445],{"title":123,"list":124,"isOpened":114},"Bash",[125,128],{"name":126,"path":127,"isActive":114},"Дан фрагмент bash-скрипта: cd ~; mkdir foo... Что в нем происходит?","/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":129,"path":130,"isActive":114},"Дан фрагмент bash-скрипта: target=$(ps -Af | grep $1 | head -n 1)...","/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"title":132,"list":133,"isOpened":114},"CSS",[134,137,140,143,146,149,152,155],{"name":135,"path":136,"isActive":114},"Дан HTML-код. Какой будет цвет у текста «Some dummy text»?","/technical-interview/tasks/the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":138,"path":139,"isActive":114},"Есть шаблон HTML и CSS кода. Какой будет цвет у текста «Таким образом, постоянное»?","/technical-interview/tasks/there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":141,"path":142,"isActive":114},"Есть шаблон вложенного HTML кода. Какой будет цвет у текста «One more dummy text»?","/technical-interview/tasks/there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":144,"path":145,"isActive":114},"Есть шаблон вложенного HTML кода. Будет ли display:block у body влиять на span?","/technical-interview/tasks/there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":147,"path":148,"isActive":114},"Есть HTML код. Будет ли font-weight на span влиять?","/technical-interview/tasks/there-is-an-html-code-will-font-weight-affect-span",{"name":150,"path":151,"isActive":114},"Flexbox и Grid, чем отличаются друг от друга?","/technical-interview/tasks/what-are-the-differences-between-flexbox-and-grid",{"name":153,"path":154,"isActive":114},"Заменяют ли Flexbox и Grid друг друга?","/technical-interview/tasks/do-flexbox-and-grid-replace-each-other",{"name":156,"path":157,"isActive":114},"Есть CSS и JS анимация. Какая между ними разница, что быстрее, что более удобно?","/technical-interview/tasks/there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"title":159,"list":160,"isOpened":114},"Git",[161,164,167],{"name":162,"path":163,"isActive":114},"Разрабатывал, взял закоммитил, запушил. Оказалось, что запушил не в ту ветку, точнее, коммит не в ту ветку. Какие действия?","/technical-interview/tasks/developed-it-committed-it-and-launched-it-it-turned-out-that-i-had-pushed-it-to-the-wrong-branch-or-rather-the-commit-was-in-the-wrong-branch-what-actions",{"name":165,"path":166,"isActive":114},"В git есть несколько вариантов слияния веток, какие? Чем отличаются?","/technical-interview/tasks/git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":168,"path":169,"isActive":114},"Какие существуют стратегии ветвления для работы команды? Что это такое?","/technical-interview/tasks/what-are-the-branching-strategies-for-the-team-what-is-it",{"title":171,"list":172,"isOpened":114},"HTML",[173],{"name":174,"path":175,"isActive":114},"Что такое HTML?","/technical-interview/tasks/what-is-html",{"title":177,"list":178,"isOpened":114},"JavaScript",[179,182,185,188,191,194,197,200,203,206,209,212,215,218,221,224,227,230,233,236,239,242,245,248,251,254,257,260,263,266,269,272,274,277,280,283,286,289,292,295,298,301,304,307,310,313],{"name":180,"path":181,"isActive":114},"Какие логические значения в console.log будут получены?","/technical-interview/tasks/prototype-what-logical-values-will-be-received-in-console-log",{"name":183,"path":184,"isActive":114},"Почему опасно писать прямо в прототипы базовых типов?","/technical-interview/tasks/why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":186,"path":187,"isActive":114},"Что вернёт следующий код? Object.create(null).hasOwnProperty('toString')","/technical-interview/tasks/what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":189,"path":190,"isActive":114},"Какое значение выведет консоль с object.property?","/technical-interview/tasks/what-value-will-the-console-output-with-object-property",{"name":192,"path":193,"isActive":114},"Что выведется в console.log([arr[0](), arr[0]()])?","/technical-interview/tasks/what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":195,"path":196,"isActive":114},"Что выведет console.log в результате выполнения цикла while?","/technical-interview/tasks/what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":198,"path":199,"isActive":114},"Есть функция и объект. Напишите все известные вам способы, чтобы вывести в консоли значение x из объекта, используя функцию","/technical-interview/tasks/there-is-a-function-and-an-object-write-all-the-ways-you-know-to-output-the-value-of-x-from-an-object-in-the-console-using-the-function",{"name":201,"path":202,"isActive":114},"Что вернёт метод book.getUpperName()?","/technical-interview/tasks/what-will-the-book-get-upper-name-method-return",{"name":204,"path":205,"isActive":114},"Переменные объявлены следующим образом: a=3; b=«hello»;. Укажите правильное утверждение","/technical-interview/tasks/variables-are-declared-as-follows-specify-the-correct-statement",{"name":207,"path":208,"isActive":114},"Что выведет консоль в случае присвоения свойства массиву по строковому положительному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":210,"path":211,"isActive":114},"Что выведет консоль в случае присвоения свойства массиву по строковому отрицательному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":213,"path":214,"isActive":114},"Что выведет консоль в случае удаления элемента массива с помощью оператора delete?","/technical-interview/tasks/what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":216,"path":217,"isActive":114},"Что вернёт этот код: typeof (function(){})()","/technical-interview/tasks/what-this-code-will-return-typeof-function",{"name":219,"path":220,"isActive":114},"Что получится в результате передачи объекта как аргумента в функцию и выполнения кода?","/technical-interview/tasks/what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":222,"path":223,"isActive":114},"Какие способы объявления функции есть в JavaScript?","/technical-interview/tasks/what-are-the-ways-to-declare-a-function-in-javascript",{"name":225,"path":226,"isActive":114},"Что такое this в JavaScript?","/technical-interview/tasks/what-is-this-in-javascript",{"name":228,"path":229,"isActive":114},"Что такое Event Loop, как работает?","/technical-interview/tasks/what-is-an-event-loop-and-how-does-it-work",{"name":231,"path":232,"isActive":114},"Что будет, если вызвать typeof на необъявленной переменной?","/technical-interview/tasks/what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":234,"path":235,"isActive":114},"Что показывает оператор typeof в JavaScript?","/technical-interview/tasks/what-does-the-typeof-operator-show-in-javascript",{"name":237,"path":238,"isActive":114},"Какие типы данных существует в JavaScript?","/technical-interview/tasks/what-types-of-data-exist-in-javascript",{"name":240,"path":241,"isActive":114},"Какую структуру использовать для хранения упорядоченного списка строк в JavaScript?","/technical-interview/tasks/what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":243,"path":244,"isActive":114},"Что вернет typeof для массива?","/technical-interview/tasks/what-will-typeof-return-for-an-array",{"name":246,"path":247,"isActive":114},"Почему оператор typeof, применённый к массиву, возвращает объект?","/technical-interview/tasks/why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":249,"path":250,"isActive":114},"Если нужно хранить список уникальных строк, какую структуру данных выбрать?","/technical-interview/tasks/if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":252,"path":253,"isActive":114},"Что возвращает typeof для new Set в JavaScript?","/technical-interview/tasks/what-does-typeof-return-for-new-set-in-javascript",{"name":255,"path":256,"isActive":114},"Почему в JavaScript два объекта с одинаковым содержимым при сравнении возвращают false?","/technical-interview/tasks/why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":258,"path":259,"isActive":114},"В чем разница между микро- и макро-тасками в JavaScript?","/technical-interview/tasks/what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":261,"path":262,"isActive":114},"arr.push(0) повлияет на массив так же, как если бы мы выполнили...","/technical-interview/tasks/arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":264,"path":265,"isActive":114},"Вернуть массив от 1 до n, где числа, кратные 3, заменены на 'fizz', кратные 5 - на 'buzz', а кратные и 3, и 5 одновременно - на 'fizzbuzz'","/technical-interview/tasks/returns-an-array-from-1-to-n-replacing-numbers-that-are-multiples-of-3-with-fizz-numbers-that-are-multiples-of-5-with-buzz-and-numbers-that-are-multiples-of-both-3-and-5-with-fizzbuzz",{"name":267,"path":268,"isActive":114},"Дана строка: 'one.two.three.four.five'. Необходимо из строки сделать вложенный объект","/technical-interview/tasks/the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":270,"path":271,"isActive":114},"Дано дерево (вложенный объект), надо найти сумму всех вершин","/technical-interview/tasks/given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":7,"path":273,"isActive":114},"/technical-interview/tasks/for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":275,"path":276,"isActive":114},"Для каждой ветви дерева записать номер вложенности данной ветви","/technical-interview/tasks/for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":278,"path":279,"isActive":114},"Есть массив, в котором лежат объекты с датами, необходимо отсортировать даты по возрастанию","/technical-interview/tasks/there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":281,"path":282,"isActive":114},"Есть слова в массиве, необходимо определить, состоят ли они из одних и тех же букв","/technical-interview/tasks/there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":284,"path":285,"isActive":114},"Есть строка, состоящая из разных скобок, необходимо проверить, закрыты ли все","/technical-interview/tasks/there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":287,"path":288,"isActive":114}," Найти в массиве неповторяющиеся числа","/technical-interview/tasks/find-non-repeating-numbers-in-an-array",{"name":290,"path":291,"isActive":114},"Напишите функцию, который сделает из массива объект","/technical-interview/tasks/write-a-function-that-will-make-an-object-out-of-an-array",{"name":293,"path":294,"isActive":114},"Необходимо проверить, являются ли две строки анаграммами друг друга","/technical-interview/tasks/checks-whether-two-strings-are-anagrams-of-each-other",{"name":296,"path":297,"isActive":114},"Нечётные числа должны отсортироваться по возрастанию, а чётные должны остаться на своих местах","/technical-interview/tasks/odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":299,"path":300,"isActive":114},"Определить, является ли слово палиндромом","/technical-interview/tasks/determines-whether-a-word-is-a-palindrome",{"name":302,"path":303,"isActive":114},"«Расплющивание» массива","/technical-interview/tasks/flattening-the-array",{"name":305,"path":306,"isActive":114},"Реализовать функцию, принимающую аргументы \"*\", \"1\", \"b\", \"1c\" и возвращающую строку \"1*b*1c\"","/technical-interview/tasks/implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":308,"path":309,"isActive":114},"Сжатие строк","/technical-interview/tasks/string-compression",{"name":311,"path":312,"isActive":114},"Уникализация значений в массиве","/technical-interview/tasks/unifying-values-in-an-array",{"name":314,"path":315,"isActive":114},"Числа от 1 до 100 находятся в массиве, они хаотично перемешанные, но в нём не хватает одного числа из этой последовательности. Необходимо найти его","/technical-interview/tasks/the-numbers-from-1-to-100-are-in-the-array-they-are-randomly-mixed-but-it-lacks-one-number-from-this-sequence-it-is-necessary-to-find-him",{"title":317,"list":318,"isOpened":114},"React",[319,322,325,328,331,334,337],{"name":320,"path":321,"isActive":114},"Для чего нужен React, какие он решает проблемы?","/technical-interview/tasks/what-is-react-used-for-and-what-problems-does-it-solve",{"name":323,"path":324,"isActive":114},"Какой механизм лежит в основе оптимизации обновлений DOM в React?","/technical-interview/tasks/what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":326,"path":327,"isActive":114},"Если убрать в React VDOM/Fiber, и вручную изменять DOM, разве это не оптимально?","/technical-interview/tasks/if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":329,"path":330,"isActive":114},"Есть блок кода. Что в реальном DOM изменится после нажатия на кнопку?","/technical-interview/tasks/there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":332,"path":333,"isActive":114},"Есть код, в котором список и кнопка. Что в реальном DOM изменится после нажатия на кнопку?","/technical-interview/tasks/there-is-a-code-in-which-there-is-a-list-and-a-button-what-will-change-in-the-real-dom-after-clicking-on-the-button",{"name":335,"path":336,"isActive":114},"Зачем нужен Redux (Mobx/Effector)? Зачем нужен менеджер состояния? Какие проблемы решает?","/technical-interview/tasks/why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":338,"path":339,"isActive":114},"Что мешает организовать централизованное состояние без менеджера состояния? Если организовать состояние механизмами реакта: контекстом, стейтом, в чем проблема? Что менеджеры состояния привносят?","/technical-interview/tasks/what-prevents-you-from-organizing-a-centralized-state-without-a-state-manager-if-you-organize-the-state-using-react-context-and-state-mechanisms-what-is-the-problem-what-do-state-managers-add",{"title":341,"list":342,"isOpened":114},"Алгоритмы",[343,346],{"name":344,"path":345,"isActive":114},"Что такое алгоритмическая сложность?","/technical-interview/tasks/what-is-algorithmic-complexity",{"name":347,"path":348,"isActive":114},"Какая алгоритмическая сложность у \"быстрой сортировки\"?","/technical-interview/tasks/what-is-the-algorithmic-complexity-of-quick-sort",{"title":350,"list":351,"isOpened":114},"Дебаггинг",[352],{"name":353,"path":354,"isActive":114},"Как диагностировать и исправить нежелательное изменение цвета фона по клику на кнопку, если исходный код сайта запутан и недоступен для прямого чтения?","/technical-interview/tasks/how-can-diagnose-and-fix-unwanted-background-color-changes-when-clicking-on-a-button-if-the-source-code-of-the-site-is-confusing-and-inaccessible-to-direct-reading",{"title":356,"list":357,"isOpened":114},"Компьютерные сети",[358,361,364,367,370,373,376,379,382,385,388,391,394,397,400,403,406,409,412,415],{"name":359,"path":360,"isActive":114},"Как браузер после ввода домена понимает, откуда брать сайт?","/technical-interview/tasks/how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":362,"path":363,"isActive":114},"Что такое DNS, как DNS находит нужный IP-адрес?","/technical-interview/tasks/what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":365,"path":366,"isActive":114},"Как домен попадает в DNS в таблицу соответствия: домен – ip","/technical-interview/tasks/how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":368,"path":369,"isActive":114},"Как браузер решает, какое соединение ему открывать, TCP или UDP?","/technical-interview/tasks/how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":371,"path":372,"isActive":114},"Ключевые отличия TCP и UDP","/technical-interview/tasks/key-differences-between-tcp-and-udp",{"name":374,"path":375,"isActive":114},"\"TCP/IP\" - кем является TCP, а кем IP в данном случае?","/technical-interview/tasks/tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":377,"path":378,"isActive":114},"Что такое HTTP и из чего состоит?","/technical-interview/tasks/what-is-http-and-what-does-it-consist-of",{"name":380,"path":381,"isActive":114},"Что такое заголовки в HTTP и зачем они нужны?","/technical-interview/tasks/what-are-http-headers-and-why-do-we-need-them",{"name":383,"path":384,"isActive":114},"Что такое параметры в HTTP?","/technical-interview/tasks/what-are-http-parameters",{"name":386,"path":387,"isActive":114},"Где находится HTML-код в структуре HTTP-ответа?","/technical-interview/tasks/where-is-the-html-code-located-in-the-http-response-structure",{"name":389,"path":390,"isActive":114},"Чем отличаются 1.0, 1.1, 2.0, 3.0 версии HTTP?","/technical-interview/tasks/what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":392,"path":393,"isActive":114},"Пользователь авторизован на сайте. Как сервер узнает об этом с последующими другими заходами, что «я – авторизованный пользователь»?","/technical-interview/tasks/the-user-is-logged-in-on-the-website-how-does-the-server-know-that-i-am-an-authorized-user-when-the-user-logs-in-again",{"name":395,"path":396,"isActive":114},"Что такое cookie?","/technical-interview/tasks/what-is-a-cookie",{"name":398,"path":399,"isActive":114},"Кто является инициатором записи cookie в браузере?","/technical-interview/tasks/who-initiates-the-cookie-recording-in-the-browser",{"name":401,"path":402,"isActive":114},"Есть ли возможность с клиента (с браузера) управлять cookie?","/technical-interview/tasks/is-it-possible-to-manage-cookies-from-the-client-browser",{"name":404,"path":405,"isActive":114},"Верно ли утверждение, что злоумышленник, контролирующий роутер и прослушивающий трафик, может получить логины и пароли от сайтов, на которые заходит клиент?","/technical-interview/tasks/is-it-true-that-an-attacker-who-controls-a-router-and-listens-to-traffic-can-obtain-logins-and-passwords-from-websites-that-a-client-visits",{"name":407,"path":408,"isActive":114},"Всё, что идет по HTTPS – оно защищено?","/technical-interview/tasks/is-everything-that-goes-through-https-secure",{"name":410,"path":411,"isActive":114},"Все данные зашифрованы, используется https. Хакер взламывает dns и делает подмену одного ip на другой, на фишинговый сайт. В этом случае, злоумышленник может получить данные (логин \\ пароль)?","/technical-interview/tasks/all-data-is-encrypted-https-is-used-let-s-assume-a-hacker-hacks-the-dns-and-makes-a-substitution-of-one-ip-for-another-a-phishing-site",{"name":413,"path":414,"isActive":114},"Есть веб-приложение. Помимо HTTP, какие протоколы того же уровня (Application Layer) можно дополнительно использовать в веб-приложении в браузере?","/technical-interview/tasks/there-is-a-web-application-in-addition-to-http-what-other-protocols-of-the-same-level-application-layer-can-be-used-in-the-web-application-in-browser",{"name":416,"path":417,"isActive":114},"Каким способом может выполняться авторизация пользователя на сайте?","/technical-interview/tasks/how-can-a-user-be-authorized-on-a-website",{"title":419,"list":420,"isOpened":114},"Отрисовка в браузере",[421,424,427,430,433,436],{"name":422,"path":423,"isActive":114},"Что происходит, когда HTTP прислал HTML? Что браузер дальше делает c HTML с учетом того, что она валидная?","/technical-interview/tasks/what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":425,"path":426,"isActive":114},"Как браузер парсит JavaScript и изображения при рендеринге?","/technical-interview/tasks/how-the-browser-parses-javascript-and-images-when-rendering",{"name":428,"path":429,"isActive":114},"Что в браузере блокирует рендеринг страницы?","/technical-interview/tasks/what-is-blocking-the-page-rendering-in-the-browser",{"name":431,"path":432,"isActive":114},"Что такое DOM в браузере? Что такое CSSOM?","/technical-interview/tasks/what-is-dom-in-a-browser-what-is-cssom",{"name":434,"path":435,"isActive":114},"Что является узлами в DOM?","/technical-interview/tasks/what-are-nodes-in-the-dom",{"name":437,"path":438,"isActive":114},"Из чего состоит CSSOM?","/technical-interview/tasks/what-does-cssom-consist-of",{"title":440,"list":441,"isOpened":114},"Ревью кода",[442],{"name":443,"path":444,"isActive":114},"По каким характеристикам, ревьюер понимает, что данный код - хороший, а этот код - плохой?","/technical-interview/tasks/how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"title":446,"list":447,"isOpened":114},"Теория вероятности",[448,451,454],{"name":449,"path":450,"isActive":114},"В комнате три человека. Какова вероятность того, что хотя бы двое из них одного пола? То есть два и более.","/technical-interview/tasks/there-are-three-people-in-the-room-what-is-the-probability-that-at-least-two-of-them-are-of-the-same-sex-that-is-two-or-more",{"name":452,"path":453,"isActive":114},"Есть монета. Ее подбрасывают пять раз подряд. Каждый раз записывается, что выпало - орел или решка. Сколько разных последовательностей орлов и решек может при этом получиться?","/technical-interview/tasks/there-is-a-coin-it-is-tossed-five-times-in-a-row-each-time-it-is-recorded-whether-it-lands-on-heads-or-tails-how-many-different-sequences-of-heads-and-tails-can-be-obtained",{"name":455,"path":456,"isActive":114},"Как гарантированно найти лёгкую фальшивую монету среди 8 за минимальное число взвешиваний на чашечных весах?","/technical-interview/tasks/how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"slugs":458},[459,462,464,466,468,471,474,476,478,480,482,484,487,489,491,493,495,497,499,501,503,505,507,509,511,513,515,517,519,521,523,525,527,529,531,533,535,537,539,541,543,545,547,549,551,553,555,557,559,561,563,565,567,569,571,573,575,577,579,581,583,585,587,589,591,593,595,597,599,601,603,605,607,609,611,613,615,617,619,621,623,625,627,629,631,633,635,637,639,641,643,645,647,649,651,653,655,657,659,661,663,665,667,668,670,672,674,676],{"name":460,"value":461},"Теоретические задания","theoretical-tasks",{"name":216,"value":463},"what-this-code-will-return-typeof-function",{"name":115,"value":465},"where-to-begin",{"name":183,"value":467},"why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":469,"value":470},"Backend","backend",{"name":472,"value":473},"Frontend","frontend",{"name":180,"value":475},"prototype-what-logical-values-will-be-received-in-console-log",{"name":296,"value":477},"odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":287,"value":479},"find-non-repeating-numbers-in-an-array",{"name":261,"value":481},"arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":267,"value":483},"the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":485,"value":486},"Реализовать функцию, похоже как в Jquery","implement-a-function-similar-to-jquery",{"name":7,"value":488},"for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":189,"value":490},"what-value-will-the-console-output-with-object-property",{"name":192,"value":492},"what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":264,"value":494},"returns-an-array-from-1-to-n-replacing-numbers-that-are-multiples-of-3-with-fizz-numbers-that-are-multiples-of-5-with-buzz-and-numbers-that-are-multiples-of-both-3-and-5-with-fizzbuzz",{"name":293,"value":496},"checks-whether-two-strings-are-anagrams-of-each-other",{"name":299,"value":498},"determines-whether-a-word-is-a-palindrome",{"name":278,"value":500},"there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":305,"value":502},"implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":270,"value":504},"given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":275,"value":506},"for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":281,"value":508},"there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":314,"value":510},"the-numbers-from-1-to-100-are-in-the-array-they-are-randomly-mixed-but-it-lacks-one-number-from-this-sequence-it-is-necessary-to-find-him",{"name":284,"value":512},"there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":290,"value":514},"write-a-function-that-will-make-an-object-out-of-an-array",{"name":195,"value":516},"what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":198,"value":518},"there-is-a-function-and-an-object-write-all-the-ways-you-know-to-output-the-value-of-x-from-an-object-in-the-console-using-the-function",{"name":210,"value":520},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":213,"value":522},"what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":311,"value":524},"unifying-values-in-an-array",{"name":302,"value":526},"flattening-the-array",{"name":201,"value":528},"what-will-the-book-get-upper-name-method-return",{"name":308,"value":530},"string-compression",{"name":207,"value":532},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":219,"value":534},"what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":359,"value":536},"how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":365,"value":538},"how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":368,"value":540},"how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":371,"value":542},"key-differences-between-tcp-and-udp",{"name":374,"value":544},"tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":377,"value":546},"what-is-http-and-what-does-it-consist-of",{"name":380,"value":548},"what-are-http-headers-and-why-do-we-need-them",{"name":383,"value":550},"what-are-http-parameters",{"name":386,"value":552},"where-is-the-html-code-located-in-the-http-response-structure",{"name":174,"value":554},"what-is-html",{"name":389,"value":556},"what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":392,"value":558},"the-user-is-logged-in-on-the-website-how-does-the-server-know-that-i-am-an-authorized-user-when-the-user-logs-in-again",{"name":395,"value":560},"what-is-a-cookie",{"name":398,"value":562},"who-initiates-the-cookie-recording-in-the-browser",{"name":401,"value":564},"is-it-possible-to-manage-cookies-from-the-client-browser",{"name":566,"value":93},"Лайвкодинг",{"name":186,"value":568},"what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":407,"value":570},"is-everything-that-goes-through-https-secure",{"name":410,"value":572},"all-data-is-encrypted-https-is-used-let-s-assume-a-hacker-hacks-the-dns-and-makes-a-substitution-of-one-ip-for-another-a-phishing-site",{"name":413,"value":574},"there-is-a-web-application-in-addition-to-http-what-other-protocols-of-the-same-level-application-layer-can-be-used-in-the-web-application-in-browser",{"name":425,"value":576},"how-the-browser-parses-javascript-and-images-when-rendering",{"name":422,"value":578},"what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":428,"value":580},"what-is-blocking-the-page-rendering-in-the-browser",{"name":431,"value":582},"what-is-dom-in-a-browser-what-is-cssom",{"name":434,"value":584},"what-are-nodes-in-the-dom",{"name":437,"value":586},"what-does-cssom-consist-of",{"name":135,"value":588},"the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":138,"value":590},"there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":141,"value":592},"there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":144,"value":594},"there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":147,"value":596},"there-is-an-html-code-will-font-weight-affect-span",{"name":150,"value":598},"what-are-the-differences-between-flexbox-and-grid",{"name":153,"value":600},"do-flexbox-and-grid-replace-each-other",{"name":156,"value":602},"there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"name":119,"value":604},"tasks",{"name":222,"value":606},"what-are-the-ways-to-declare-a-function-in-javascript",{"name":225,"value":608},"what-is-this-in-javascript",{"name":228,"value":610},"what-is-an-event-loop-and-how-does-it-work",{"name":231,"value":612},"what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":234,"value":614},"what-does-the-typeof-operator-show-in-javascript",{"name":237,"value":616},"what-types-of-data-exist-in-javascript",{"name":240,"value":618},"what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":243,"value":620},"what-will-typeof-return-for-an-array",{"name":246,"value":622},"why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":249,"value":624},"if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":252,"value":626},"what-does-typeof-return-for-new-set-in-javascript",{"name":320,"value":628},"what-is-react-used-for-and-what-problems-does-it-solve",{"name":326,"value":630},"if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":329,"value":632},"there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":332,"value":634},"there-is-a-code-in-which-there-is-a-list-and-a-button-what-will-change-in-the-real-dom-after-clicking-on-the-button",{"name":335,"value":636},"why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":353,"value":638},"how-can-diagnose-and-fix-unwanted-background-color-changes-when-clicking-on-a-button-if-the-source-code-of-the-site-is-confusing-and-inaccessible-to-direct-reading",{"name":162,"value":640},"developed-it-committed-it-and-launched-it-it-turned-out-that-i-had-pushed-it-to-the-wrong-branch-or-rather-the-commit-was-in-the-wrong-branch-what-actions",{"name":165,"value":642},"git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":168,"value":644},"what-are-the-branching-strategies-for-the-team-what-is-it",{"name":443,"value":646},"how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"name":126,"value":648},"here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":129,"value":650},"here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"name":344,"value":652},"what-is-algorithmic-complexity",{"name":347,"value":654},"what-is-the-algorithmic-complexity-of-quick-sort",{"name":255,"value":656},"why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":416,"value":658},"how-can-a-user-be-authorized-on-a-website",{"name":258,"value":660},"what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":449,"value":662},"there-are-three-people-in-the-room-what-is-the-probability-that-at-least-two-of-them-are-of-the-same-sex-that-is-two-or-more",{"name":452,"value":664},"there-is-a-coin-it-is-tossed-five-times-in-a-row-each-time-it-is-recorded-whether-it-lands-on-heads-or-tails-how-many-different-sequences-of-heads-and-tails-can-be-obtained",{"name":455,"value":666},"how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"name":108,"value":109},{"name":404,"value":669},"is-it-true-that-an-attacker-who-controls-a-router-and-listens-to-traffic-can-obtain-logins-and-passwords-from-websites-that-a-client-visits",{"name":362,"value":671},"what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":204,"value":673},"variables-are-declared-as-follows-specify-the-correct-statement",{"name":323,"value":675},"what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":338,"value":677},"what-prevents-you-from-organizing-a-centralized-state-without-a-state-manager-if-you-organize-the-state-using-react-context-and-state-mechanisms-what-is-the-problem-what-do-state-managers-add",{"cooperation":679,"copyright":682,"reportError":683,"socialNetwork":685},{"link":680,"title":681},"https://t.me/baurinanton","Сотрудничество","© “GOOD WEB JOB!”",{"label":684,"link":680},"Сообщить об ошибке",{"label":686,"socialNetworkList":687},"Мы в соцсетях:",[688,691,694],{"icon":51,"link":689,"title":690},"https://max.ru/u/f9LHodD0cOKMaukdnnahTeL5pwvjrPfUaZ4S8_1rsNy9I9qsmc9Ar3kP_y8","Max",{"icon":692,"link":680,"title":693},"ic:baseline-telegram","Telegram",{"icon":695,"link":696,"title":697},"ri:vk-fill","https://vk.com/baurinanton","VK",{"data":699,"body":700},{},{"type":701,"children":702},"root",[703,711,724,729,742,751,756,765,774],{"type":704,"tag":705,"props":706,"children":707},"element","p",{},[708],{"type":709,"value":710},"text","Дан объект:",{"type":704,"tag":712,"props":713,"children":717},"pre",{"className":714,"code":716,"language":709},[715],"language-text","const object = {\n  a: {\n    d: {\n      h: 4,\n    },\n    e: 2,\n  },\n  b: 1,\n  c: {\n    f: {\n      g: 3,\n      k: {},\n    },\n  },\n};\n",[718],{"type":704,"tag":719,"props":720,"children":722},"code",{"__ignoreMap":721},"",[723],{"type":709,"value":716},{"type":704,"tag":705,"props":725,"children":726},{},[727],{"type":709,"value":728},"Необходимо для каждого вложенного объекта нужно добавить свойство level, которое равняется числу - номер вложенности. Если значение свойства будет не объект, то ничего не добавлять",{"type":704,"tag":705,"props":730,"children":731},{},[732,734,740],{"type":709,"value":733},"То есть, функция ",{"type":704,"tag":719,"props":735,"children":737},{"className":736},[],[738],{"type":709,"value":739},"addlevelInObj(object)",{"type":709,"value":741}," принимает объект object, описаный выше и должна возвратить объект вида:",{"type":704,"tag":712,"props":743,"children":746},{"className":744,"code":745,"language":709},[715],"{\n  a: {\n    level: 1,\n    d: {\n      level: 2,\n      h: 4,\n    },\n    e: 2,\n  },\n  b: 1,\n  c: {\n    level: 1,\n    f: {\n      level: 2,\n      g: 3,\n      k: {\n        level: 3,\n      },\n    },\n  },\n}\n",[747],{"type":704,"tag":719,"props":748,"children":749},{"__ignoreMap":721},[750],{"type":709,"value":745},{"type":704,"tag":705,"props":752,"children":753},{},[754],{"type":709,"value":755},"Примеры:",{"type":704,"tag":712,"props":757,"children":760},{"className":758,"code":759,"language":709},[715],"// Параметр функции:\n{\n  a: {\n    d: {\n      h: 4,\n    },\n    e: 2,\n  },\n  b: 1,\n  c: {\n    f: {\n      g: 3,\n      k: {},\n    },\n  },\n}\n\n// Возвращаемое значение функции:\n{\n  a: {\n    level: 1,\n    d: {\n      level: 2,\n      h: 4,\n    },\n    e: 2,\n  },\n  b: 1,\n  c: {\n    level: 1,\n    f: {\n      level: 2,\n      g: 3,\n      k: {\n        level: 3,\n      },\n    },\n  },\n}\n",[761],{"type":704,"tag":719,"props":762,"children":763},{"__ignoreMap":721},[764],{"type":709,"value":759},{"type":704,"tag":712,"props":766,"children":769},{"className":767,"code":768,"language":709},[715],"// Параметр функции:\n{\n  a: {\n    d: 4,\n  },\n  b: 1,\n  c: {\n    k: {},\n  },\n}\n\n// Возвращаемое значение функции:\n{\n  a: {\n    level: 1,\n    d: 4,\n  },\n  b: 1,\n  c: {\n    level: 1,\n    k: {\n      level: 2,\n    },\n  },\n}\n",[770],{"type":704,"tag":719,"props":771,"children":772},{"__ignoreMap":721},[773],{"type":709,"value":768},{"type":704,"tag":705,"props":775,"children":776},{},[777,779,785],{"type":709,"value":778},"P.s. результаты функции и тестовых данных сравниваются с помощью результата оборачивания объектов в ",{"type":704,"tag":719,"props":780,"children":782},{"className":781},[],[783],{"type":709,"value":784},"JSON.stringify",{"type":709,"value":786},", поэтому соблюдение порядка полей важно.",{"data":788,"body":789},{},{"type":701,"children":790},[791,818,823],{"type":704,"tag":705,"props":792,"children":793},{},[794,796,802,804,808,810,816],{"type":709,"value":795},"Для задачи требуется добавлять ",{"type":704,"tag":719,"props":797,"children":799},{"className":798},[],[800],{"type":709,"value":801},"level",{"type":709,"value":803}," только тем значениям, которые являются вложенными объектами (обычными объектами), а не примитивами.",{"type":704,"tag":805,"props":806,"children":807},"br",{},[],{"type":709,"value":809},"\nПрактичная проверка для “обычного объекта” в рамках задания: ",{"type":704,"tag":719,"props":811,"children":813},{"className":812},[],[814],{"type":709,"value":815},"value !== null && typeof value === \"object\" && !Array.isArray(value)",{"type":709,"value":817},".",{"type":704,"tag":705,"props":819,"children":820},{},[821],{"type":709,"value":822},"Почему проверка именно такая:",{"type":704,"tag":824,"props":825,"children":826},"ul",{},[827,847,874],{"type":704,"tag":828,"props":829,"children":830},"li",{},[831,837,839,845],{"type":704,"tag":719,"props":832,"children":834},{"className":833},[],[835],{"type":709,"value":836},"typeof value === \"object\"",{"type":709,"value":838}," отсеивает числа, строки, булевы значения, ",{"type":704,"tag":719,"props":840,"children":842},{"className":841},[],[843],{"type":709,"value":844},"undefined",{"type":709,"value":846},", функции.",{"type":704,"tag":828,"props":848,"children":849},{},[850,856,858,864,866,872],{"type":704,"tag":719,"props":851,"children":853},{"className":852},[],[854],{"type":709,"value":855},"value !== null",{"type":709,"value":857}," обязателен, так как ",{"type":704,"tag":719,"props":859,"children":861},{"className":860},[],[862],{"type":709,"value":863},"null",{"type":709,"value":865}," технически возвращает тип ",{"type":704,"tag":719,"props":867,"children":869},{"className":868},[],[870],{"type":709,"value":871},"\"object\"",{"type":709,"value":873},", но по смыслу не является объектом с полями.",{"type":704,"tag":828,"props":875,"children":876},{},[877,883],{"type":704,"tag":719,"props":878,"children":880},{"className":879},[],[881],{"type":709,"value":882},"!Array.isArray(value)",{"type":709,"value":884}," исключает массивы, так как по условию требуется работать с вложенными объектами, а не с коллекциями (если массивы тоже нужно обрабатывать, это условие можно убрать, но тогда изменится смысл задания).",{"data":886,"body":887},{},{"type":701,"children":888},[889,899,931,936,945,950,988,993],{"type":704,"tag":705,"props":890,"children":891},{},[892,897],{"type":704,"tag":719,"props":893,"children":895},{"className":894},[],[896],{"type":709,"value":801},{"type":709,"value":898}," — это число, показывающее сколько “шагов вниз” сделано от корня до текущего объекта:",{"type":704,"tag":824,"props":900,"children":901},{},[902,914,926],{"type":704,"tag":828,"props":903,"children":904},{},[905,907,913],{"type":709,"value":906},"Дочерние объекты корня получают ",{"type":704,"tag":719,"props":908,"children":910},{"className":909},[],[911],{"type":709,"value":912},"level: 1",{"type":709,"value":817},{"type":704,"tag":828,"props":915,"children":916},{},[917,919,925],{"type":709,"value":918},"Их дочерние объекты получают ",{"type":704,"tag":719,"props":920,"children":922},{"className":921},[],[923],{"type":709,"value":924},"level: 2",{"type":709,"value":817},{"type":704,"tag":828,"props":927,"children":928},{},[929],{"type":709,"value":930},"И так далее.",{"type":704,"tag":705,"props":932,"children":933},{},[934],{"type":709,"value":935},"Текстовая схема для примера:",{"type":704,"tag":712,"props":937,"children":940},{"className":938,"code":939,"language":709},[715],"root\n├─ a (level 1)\n│  ├─ d (level 2)\n│  │  └─ h = 4 (не объект)\n│  └─ e = 2 (не объект)\n├─ b = 1 (не объект)\n└─ c (level 1)\n   └─ f (level 2)\n      ├─ g = 3 (не объект)\n      └─ k (level 3)\n",[941],{"type":704,"tag":719,"props":942,"children":943},{"__ignoreMap":721},[944],{"type":709,"value":939},{"type":704,"tag":705,"props":946,"children":947},{},[948],{"type":709,"value":949},"Рекурсивная идея:",{"type":704,"tag":824,"props":951,"children":952},{},[953,964,976],{"type":704,"tag":828,"props":954,"children":955},{},[956,958,963],{"type":709,"value":957},"Функция получает объект и текущий ",{"type":704,"tag":719,"props":959,"children":961},{"className":960},[],[962],{"type":709,"value":801},{"type":709,"value":817},{"type":704,"tag":828,"props":965,"children":966},{},[967,969,975],{"type":709,"value":968},"Сначала (или в конце) записывается ",{"type":704,"tag":719,"props":970,"children":972},{"className":971},[],[973],{"type":709,"value":974},"obj.level = level",{"type":709,"value":817},{"type":704,"tag":828,"props":977,"children":978},{},[979,981,987],{"type":709,"value":980},"Затем перебираются свойства; если значение — объект, делается рекурсивный вызов с ",{"type":704,"tag":719,"props":982,"children":984},{"className":983},[],[985],{"type":709,"value":986},"level + 1",{"type":709,"value":817},{"type":704,"tag":705,"props":989,"children":990},{},[991],{"type":709,"value":992},"Итеративная идея со стеком:",{"type":704,"tag":824,"props":994,"children":995},{},[996,1008],{"type":704,"tag":828,"props":997,"children":998},{},[999,1001,1007],{"type":709,"value":1000},"Вместо “вызова самой себя” данные о том, что нужно обработать позже, кладутся в массив ",{"type":704,"tag":719,"props":1002,"children":1004},{"className":1003},[],[1005],{"type":709,"value":1006},"stack",{"type":709,"value":817},{"type":704,"tag":828,"props":1009,"children":1010},{},[1011,1013,1018],{"type":709,"value":1012},"Из ",{"type":704,"tag":719,"props":1014,"children":1016},{"className":1015},[],[1017],{"type":709,"value":1006},{"type":709,"value":1019}," по одному извлекаются задачи “обработать объект src, записывать в dst, с указанным level”.",{"data":1021,"body":1022},{},{"type":701,"children":1023},[1024],{"type":704,"tag":705,"props":1025,"children":1026},{},[1027,1029,1034,1036,1041,1043,1048,1049,1052,1054,1060,1061,1067,1068,1074,1075,1081],{"type":709,"value":1028},"Примитивы (число, строка, булево значение, ",{"type":704,"tag":719,"props":1030,"children":1032},{"className":1031},[],[1033],{"type":709,"value":844},{"type":709,"value":1035},", ",{"type":704,"tag":719,"props":1037,"children":1039},{"className":1038},[],[1040],{"type":709,"value":863},{"type":709,"value":1042},") не имеют структуры “ключ → значение”, в которую логично добавлять ",{"type":704,"tag":719,"props":1044,"children":1046},{"className":1045},[],[1047],{"type":709,"value":801},{"type":709,"value":817},{"type":704,"tag":805,"props":1050,"children":1051},{},[],{"type":709,"value":1053},"\nПоэтому на свойствах вида ",{"type":704,"tag":719,"props":1055,"children":1057},{"className":1056},[],[1058],{"type":709,"value":1059},"b: 1",{"type":709,"value":1035},{"type":704,"tag":719,"props":1062,"children":1064},{"className":1063},[],[1065],{"type":709,"value":1066},"h: 4",{"type":709,"value":1035},{"type":704,"tag":719,"props":1069,"children":1071},{"className":1070},[],[1072],{"type":709,"value":1073},"e: 2",{"type":709,"value":1035},{"type":704,"tag":719,"props":1076,"children":1078},{"className":1077},[],[1079],{"type":709,"value":1080},"g: 3",{"type":709,"value":1082}," никаких изменений не выполняется.",{"data":1084,"body":1085},{},{"type":701,"children":1086},[1087,1097,1102],{"type":704,"tag":705,"props":1088,"children":1089},{},[1090,1092,1095],{"type":709,"value":1091},"При немутирующем подходе (Вариант 1 и 3) входной объект остаётся прежним, а результат строится заново. Это удобно, когда требуется предсказуемость и отсутствие побочных эффектов.",{"type":704,"tag":805,"props":1093,"children":1094},{},[],{"type":709,"value":1096},"\nПри мутации (Вариант 2) функция изменяет входной объект напрямую, что может быть быстрее по памяти, но требует аккуратности в коде, где входной объект используется повторно.",{"type":704,"tag":705,"props":1098,"children":1099},{},[1100],{"type":709,"value":1101},"Таблица различий:",{"type":704,"tag":1103,"props":1104,"children":1105},"table",{},[1106,1135],{"type":704,"tag":1107,"props":1108,"children":1109},"thead",{},[1110],{"type":704,"tag":1111,"props":1112,"children":1113},"tr",{},[1114,1120,1125,1130],{"type":704,"tag":1115,"props":1116,"children":1117},"th",{},[1118],{"type":709,"value":1119},"Вариант",{"type":704,"tag":1115,"props":1121,"children":1122},{},[1123],{"type":709,"value":1124},"Изменение входа",{"type":704,"tag":1115,"props":1126,"children":1127},{},[1128],{"type":709,"value":1129},"Глубокая вложенность",{"type":704,"tag":1115,"props":1131,"children":1132},{},[1133],{"type":709,"value":1134},"Расход памяти",{"type":704,"tag":1136,"props":1137,"children":1138},"tbody",{},[1139,1163,1185],{"type":704,"tag":1111,"props":1140,"children":1141},{},[1142,1148,1153,1158],{"type":704,"tag":1143,"props":1144,"children":1145},"td",{},[1146],{"type":709,"value":1147},"1 (рекурсия, новый объект)",{"type":704,"tag":1143,"props":1149,"children":1150},{},[1151],{"type":709,"value":1152},"Нет",{"type":704,"tag":1143,"props":1154,"children":1155},{},[1156],{"type":709,"value":1157},"Возможны ограничения стека",{"type":704,"tag":1143,"props":1159,"children":1160},{},[1161],{"type":709,"value":1162},"Выше",{"type":704,"tag":1111,"props":1164,"children":1165},{},[1166,1171,1176,1180],{"type":704,"tag":1143,"props":1167,"children":1168},{},[1169],{"type":709,"value":1170},"2 (рекурсия, in-place)",{"type":704,"tag":1143,"props":1172,"children":1173},{},[1174],{"type":709,"value":1175},"Да",{"type":704,"tag":1143,"props":1177,"children":1178},{},[1179],{"type":709,"value":1157},{"type":704,"tag":1143,"props":1181,"children":1182},{},[1183],{"type":709,"value":1184},"Ниже",{"type":704,"tag":1111,"props":1186,"children":1187},{},[1188,1193,1197,1202],{"type":704,"tag":1143,"props":1189,"children":1190},{},[1191],{"type":709,"value":1192},"3 (итерация, стек, новый объект)",{"type":704,"tag":1143,"props":1194,"children":1195},{},[1196],{"type":709,"value":1152},{"type":704,"tag":1143,"props":1198,"children":1199},{},[1200],{"type":709,"value":1201},"Обычно устойчивее",{"type":704,"tag":1143,"props":1203,"children":1204},{},[1205],{"type":709,"value":1206},"Средний",{"data":1208,"body":1209},{},{"type":701,"children":1210},[1211],{"type":704,"tag":705,"props":1212,"children":1213},{},[1214,1216,1222,1224,1229,1231,1237,1239,1245,1247,1250,1252,1257],{"type":709,"value":1215},"Пустой объект ",{"type":704,"tag":719,"props":1217,"children":1219},{"className":1218},[],[1220],{"type":709,"value":1221},"{}",{"type":709,"value":1223}," тоже является объектом, поэтому он должен получить ",{"type":704,"tag":719,"props":1225,"children":1227},{"className":1226},[],[1228],{"type":709,"value":801},{"type":709,"value":1230}," (как в примере ",{"type":704,"tag":719,"props":1232,"children":1234},{"className":1233},[],[1235],{"type":709,"value":1236},"k: {}",{"type":709,"value":1238}," → ",{"type":704,"tag":719,"props":1240,"children":1242},{"className":1241},[],[1243],{"type":709,"value":1244},"k: { level: 3 }",{"type":709,"value":1246},").",{"type":704,"tag":805,"props":1248,"children":1249},{},[],{"type":709,"value":1251},"\nЕсли во входных данных уже есть поле ",{"type":704,"tag":719,"props":1253,"children":1255},{"className":1254},[],[1256],{"type":709,"value":801},{"type":709,"value":1258},", то приведённые решения перезапишут его корректным значением глубины (это часто ожидаемо, но при необходимости можно договориться о другом поведении).",{"data":1260,"body":1261},{},{"type":701,"children":1262},[1263],{"type":704,"tag":705,"props":1264,"children":1265},{},[1266,1268,1274,1276,1282],{"type":709,"value":1267},"Если во входном объекте потенциально возможны циклические ссылки (например, ",{"type":704,"tag":719,"props":1269,"children":1271},{"className":1270},[],[1272],{"type":709,"value":1273},"obj.a = obj",{"type":709,"value":1275},"), рекурсивный и итеративный обход без защиты уйдёт в бесконечный цикл. Для защиты обычно добавляется ",{"type":704,"tag":719,"props":1277,"children":1279},{"className":1278},[],[1280],{"type":709,"value":1281},"WeakSet",{"type":709,"value":1283}," посещённых объектов.",{"data":1285,"body":1286},{},{"type":701,"children":1287},[1288,1293],{"type":704,"tag":705,"props":1289,"children":1290},{},[1291],{"type":709,"value":1292},"Пример защиты от циклов (немутирующий рекурсивный вариант):",{"type":704,"tag":712,"props":1294,"children":1297},{"className":1295,"code":1296,"language":709},[715],"function addlevelInObjSafe(input) {\n  const isPlainObject = (value) =>\n    value !== null && typeof value === \"object\" && !Array.isArray(value);\n\n  const seen = new WeakSet();\n\n  const walk = (node, level) => {\n    if (!isPlainObject(node)) return node;\n    if (seen.has(node)) return node; // или выбросить ошибку, в зависимости от требований\n    seen.add(node);\n\n    const out = {};\n    for (const [key, value] of Object.entries(node)) {\n      out[key] = isPlainObject(value) ? walk(value, level + 1) : value;\n    }\n    out.level = level;\n    return out;\n  };\n\n  const result = {};\n  for (const [key, value] of Object.entries(input)) {\n    result[key] = isPlainObject(value) ? walk(value, 1) : value;\n  }\n  return result;\n}\n",[1298],{"type":704,"tag":719,"props":1299,"children":1300},{"__ignoreMap":721},[1301],{"type":709,"value":1296},{"data":1303,"body":1304},{},{"type":701,"children":1305},[1306],{"type":704,"tag":705,"props":1307,"children":1308},{},[1309,1311,1316,1318,1323],{"type":709,"value":1310},"Кратко: необходимо выполнить обход объекта в глубину и добавлять ",{"type":704,"tag":719,"props":1312,"children":1314},{"className":1313},[],[1315],{"type":709,"value":801},{"type":709,"value":1317}," только тем значениям, которые являются вложенными обычными объектами (не ",{"type":704,"tag":719,"props":1319,"children":1321},{"className":1320},[],[1322],{"type":709,"value":863},{"type":709,"value":1324}," и не массив), увеличивая глубину на 1 при каждом входе во вложенность; это реализуется рекурсией (с мутацией или без) либо итеративно через стек.",1775575822683]