[{"data":1,"prerenderedAt":995},["ShallowReactive",2],{"$fmpba3vymrWOPlVGabTi2zvDkG4uUhTH9MIZwC-N9MPk":3,"$f-KhKwB8J0md5Q3U1oyqNCQbHxVpirjaanlJWCGo_ht4":68,"$fkVWEWXZHbLy86BhC78gDVDJ_00TY4k_DsdZD3Mz6ZO0":71,"$fqGwjmVbyPxmA5lnsLz9nF3m-ncS8WzLIlTsTA85cuZA":76,"$fVMSX_HWVzVkzv-u5ATHiOgClblPaIGZfXUn_Cq8LKn4":422,"$fw0tI3d-iV2W3zZtbRjyPNNRSgXGobrmwsMU7a1fynls":643,"mdc--wq3o7e-key":663,"mdc--2w4yw3-key":708,"mdc-5vqfcg-key":769,"mdc-9zb7a9-key":987},{"content":4,"livecodingContent":26,"type":56,"pageMeta":57},[5,9,13,16,20,23],{"id":6,"value":7,"isTypeH1":8},"1994","«Расплющивание» массива",true,{"id":10,"value":11,"anchor":12,"isTypeH2":8},"4639","Теория и алгоритм","theory-and-algorithm",{"id":14,"value":15,"isTypeParagraph":8},"10696","Многомерный массив можно представить как дерево: узлы — это массивы, а «листья» — это не-массивные значения (числа, строки, объекты и т.д.). Задача «сделать плоский массив» означает выполнить обход этого дерева слева направо и собрать все листья в один линейный список.\n\nНа практике чаще всего используется обход в глубину (DFS):\n- Если встречается массив, требуется зайти внутрь и обработать элементы по порядку.\n- Если встречается не-массив, требуется добавить значение в результат.\n\nБазовая схема (псевдокод) выглядит так:\n\n```\nwalk(value):\n  если value — массив:\n    для каждого элемента item в value:\n      walk(item)\n  иначе:\n    добавить value в result\n```\n\nПо сложности:\n- По времени все корректные реализации работают за O(n), где n — общее количество элементов на всех уровнях (каждый элемент посещается один раз).\n- По памяти: результат занимает O(n); дополнительная память зависит от подхода, рекурсия требует глубины стека O(d), итеративный стек также хранит до O(d) (и иногда больше, в зависимости от формы вложенности).",{"id":17,"value":18,"anchor":19,"isTypeH2":8},"4640","Практические детали и ошибки","practical-details-and-common-mistakes",{"id":21,"value":22,"isTypeParagraph":8},"10697","Частая ошибка — «раскрыть» массив только на один уровень (например, через поверхностное объединение), хотя по условию требуется раскрывать до конца, независимо от глубины. Это означает, что проверка и обработка должны повторяться, пока внутри не останутся только не-массивные элементы.\n\nЕщё одна ошибка — неверная проверка «это массив или нет». Для этой задачи корректная проверка — `Array.isArray(value)`, так как:\n- `typeof []` возвращает \"object\", поэтому `typeof` не подходит.\n- Строки и обычные объекты не должны раскрыться как массив, иначе будет ломаться смысл задачи.\n\nПолезно заранее определить, что считается элементом:\n- Если внутри встречаются `null` и `undefined`, они должны попадать в результат как обычные значения (если не задано иное).\n- Если внутри встречаются функции или объекты, они также должны попадать в результат как есть (если не задано иное).\n\nНебольшая таблица выбора подхода:\n\n| Подход | Плюсы | Минусы | Когда уместен |\n|---|---|---|---|\n| Рекурсия | Самая простая для понимания | Возможен переполненный стек при большой глубине | Учебные задачи, обычные входные данные |\n| Итеративно (стек) | Устойчиво к большой глубине | Код сложнее рекурсии | Очень глубокие структуры, «защитный» код |\n| Генератор | Удобно отделять обход и потребление | Может быть рекурсивным и иметь те же риски | Знакомство с yield, большие наборы данных |\n| flat(Infinity) | Самое короткое решение | Нужна поддержка среды или полифил | Современные браузеры/Node.js, без требований к старым |",{"id":24,"value":25,"isTypeParagraph":8},"10698","Кратко: задача решается обходом вложенной структуры; наиболее понятный вариант — рекурсивный DFS, наиболее устойчивый к огромной глубине — итеративный вариант со стеком, а в современных средах самый короткий путь — arr.flat(Infinity) (если доступен).",{"id":27,"functionTestData":28,"functionName":52,"functionTemplateCode":53,"solution":54,"description":55},"435",[29,41],[30,40],[31],[32,33],1,[34,35],2,[36,37],3,[38,39],4,5,[32,34,36,38,39],[42,51],[43],[32,44],[34,45],[36,46],[38,39,47],[48,49],6,[50],7,[32,34,36,38,39,48,50],"flat","function flat(arr) {\n    // ваш код здесь\n}","**Вариант 1**: Рекурсия\n\nИдея: если элемент — массив, требуется «раскрыть» его тем же алгоритмом и добавить результаты в общий ответ; если элемент не массив — добавить его как есть.\n\n```\nfunction flat(input) {\n  const result = [];\n\n  function walk(value) {\n    if (Array.isArray(value)) {\n      for (const item of value) {\n        walk(item);\n      }\n    } else {\n      result.push(value);\n    }\n  }\n\n  walk(input);\n  return result;\n}\n```\n\nРекурсивный подход может привести к переполнению стека вызовов при очень глубокой вложенности (например, тысячи уровней), поэтому для «плохих» входных данных полезно иметь итеративный вариант.\n\n**Вариант 2**: итеративно через стек\n\nИдея: собственный стек заменяет стек вызовов; чтобы сохранить порядок «слева направо», удобно доставать элементы и, если это массив, класть его элементы в стек в обратном порядке.\n\n```\nfunction flat(input) {\n  const result = [];\n  const stack = [input];\n\n  while (stack.length > 0) {\n    const value = stack.pop();\n\n    if (Array.isArray(value)) {\n      for (let i = value.length - 1; i >= 0; i--) {\n        if (i in value) stack.push(value[i]);\n      }\n    } else {\n      result.push(value);\n    }\n  }\n\n  return result;\n}\n```\n\nПроверка `i in value` позволяет корректно обрабатывать «дырки» (разреженные массивы) и пропускать отсутствующие элементы, что близко к поведению стандартного `flat()` при раскрытии.\n\n**Вариант 3**: Генератор\n\nИдея: генератор «производит» элементы по одному (через `yield`), а финальный массив собирается оператором расширения.\n\n```\nfunction* flatGen(value) {\n  if (Array.isArray(value)) {\n    for (const item of value) {\n      yield* flatGen(item);\n    }\n  } else {\n    yield value;\n  }\n}\n\nfunction flat(input) {\n  return [...flatGen(input)];\n}\n```\n\n**Вариант 4**: Встроенный метод `Array.prototype.flat(Infinity)`\n\nИдея: в современных средах JavaScript у массивов есть метод `flat(depth)`. Если передать `Infinity`, то выполняется полное «раскрытие» всех уровней вложенности, а возвращается новый массив (исходный не изменяется).\n\n```\nfunction flat(input) {\n  return input.flat(Infinity)\n}\n```\n\nВ старых окружениях метод `flat()` может отсутствовать, поэтому при требованиях к совместимости необходимо предусмотреть полифил или применять одну из реализаций выше.\n","Дан массив:\n\n```\nconst arr = [1, [2, [3, [4,5]]]]\n```\n\nНеобходимо написать функцию, которая принимает в аргументах многомерный массив \nнеограниченной вложенности и возвращает одномерный массив, состоящий \nиз элементов со всех уровней вложенности исходного массива.\n\nПримеры:\n\n```\nflat([1, [2, [3, [4,5]]]]); // => [1, 2, 3, 4, 5]\nflat([1, [2, [3, [4,5,[6,[7]]]]]]); // => [1, 2, 3, 4, 5, 6, 7]\n```","livecoding",{"title":7,"description":58,"ogTitle":7,"ogDescription":59,"ogImageUrl":60,"canonical":61,"ogLocale":62,"ogSiteName":63,"ogImageType":64,"ogImageWidth":65,"ogImageHeight":66,"ogType":67,"ogUrl":61},"Необходимо написать функцию, принимающая в аргументах многомерный массив \nнеограниченной вложенности и возвращающая новый одномерный массив","Необходимо написать функцию, принимающая в аргументах многомерный массив  неограниченной вложенности и возвращающая новый одномерный массив","/og-image.png",null,"ru_RU","goodwebjob.ru","image_jpeg","1200","630","website",{"siteName":69,"siteUrl":70},"GOOD WEB JOB!","https://goodwebjob.ru",[72],{"label":73,"slug":74,"to":75},"Подготовка к тех.интервью","technical-interview","/technical-interview/where-to-begin",{"navigationList":77,"navigationSublist":86},[78,82],{"path":75,"isActive":79,"name":80,"icon":81,"isNavbarMobileDisabled":8},false,"С чего начать?","material-symbols:visibility-outline-rounded",{"path":83,"isActive":8,"name":84,"icon":85,"isNavbarMobileDisabled":79},"/technical-interview/tasks","Сборник задач","material-symbols:task-outline",[87,96,123,135,141,281,305,314,320,383,404,410],{"title":88,"list":89,"isOpened":79},"Bash",[90,93],{"name":91,"path":92,"isActive":79},"Дан фрагмент 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":94,"path":95,"isActive":79},"Дан фрагмент 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":97,"list":98,"isOpened":79},"CSS",[99,102,105,108,111,114,117,120],{"name":100,"path":101,"isActive":79},"Дан HTML-код. Какой будет цвет у текста «Some dummy text»?","/technical-interview/tasks/the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":103,"path":104,"isActive":79},"Есть шаблон HTML и CSS кода. Какой будет цвет у текста «Таким образом, постоянное»?","/technical-interview/tasks/there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":106,"path":107,"isActive":79},"Есть шаблон вложенного 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":109,"path":110,"isActive":79},"Есть шаблон вложенного 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":112,"path":113,"isActive":79},"Есть HTML код. Будет ли font-weight на span влиять?","/technical-interview/tasks/there-is-an-html-code-will-font-weight-affect-span",{"name":115,"path":116,"isActive":79},"Flexbox и Grid, чем отличаются друг от друга?","/technical-interview/tasks/what-are-the-differences-between-flexbox-and-grid",{"name":118,"path":119,"isActive":79},"Заменяют ли Flexbox и Grid друг друга?","/technical-interview/tasks/do-flexbox-and-grid-replace-each-other",{"name":121,"path":122,"isActive":79},"Есть 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":124,"list":125,"isOpened":79},"Git",[126,129,132],{"name":127,"path":128,"isActive":79},"Разрабатывал, взял закоммитил, запушил. Оказалось, что запушил не в ту ветку, точнее, коммит не в ту ветку. Какие действия?","/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":130,"path":131,"isActive":79},"В git есть несколько вариантов слияния веток, какие? Чем отличаются?","/technical-interview/tasks/git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":133,"path":134,"isActive":79},"Какие существуют стратегии ветвления для работы команды? Что это такое?","/technical-interview/tasks/what-are-the-branching-strategies-for-the-team-what-is-it",{"title":136,"list":137,"isOpened":79},"HTML",[138],{"name":139,"path":140,"isActive":79},"Что такое HTML?","/technical-interview/tasks/what-is-html",{"title":142,"list":143,"isOpened":79},"JavaScript",[144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,189,192,195,198,201,204,207,210,213,216,219,222,225,228,231,234,237,240,243,246,249,252,255,258,261,264,267,269,272,275,278],{"name":145,"path":146,"isActive":79},"Какие логические значения в console.log будут получены?","/technical-interview/tasks/prototype-what-logical-values-will-be-received-in-console-log",{"name":148,"path":149,"isActive":79},"Почему опасно писать прямо в прототипы базовых типов?","/technical-interview/tasks/why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":151,"path":152,"isActive":79},"Что вернёт следующий код? Object.create(null).hasOwnProperty('toString')","/technical-interview/tasks/what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":154,"path":155,"isActive":79},"Какое значение выведет консоль с object.property?","/technical-interview/tasks/what-value-will-the-console-output-with-object-property",{"name":157,"path":158,"isActive":79},"Что выведется в console.log([arr[0](), arr[0]()])?","/technical-interview/tasks/what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":160,"path":161,"isActive":79},"Что выведет console.log в результате выполнения цикла while?","/technical-interview/tasks/what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":163,"path":164,"isActive":79},"Есть функция и объект. Напишите все известные вам способы, чтобы вывести в консоли значение 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":166,"path":167,"isActive":79},"Что вернёт метод book.getUpperName()?","/technical-interview/tasks/what-will-the-book-get-upper-name-method-return",{"name":169,"path":170,"isActive":79},"Переменные объявлены следующим образом: a=3; b=«hello»;. Укажите правильное утверждение","/technical-interview/tasks/variables-are-declared-as-follows-specify-the-correct-statement",{"name":172,"path":173,"isActive":79},"Что выведет консоль в случае присвоения свойства массиву по строковому положительному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":175,"path":176,"isActive":79},"Что выведет консоль в случае присвоения свойства массиву по строковому отрицательному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":178,"path":179,"isActive":79},"Что выведет консоль в случае удаления элемента массива с помощью оператора delete?","/technical-interview/tasks/what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":181,"path":182,"isActive":79},"Что вернёт этот код: typeof (function(){})()","/technical-interview/tasks/what-this-code-will-return-typeof-function",{"name":184,"path":185,"isActive":79},"Что получится в результате передачи объекта как аргумента в функцию и выполнения кода?","/technical-interview/tasks/what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":187,"path":188,"isActive":79},"Какие способы объявления функции есть в JavaScript?","/technical-interview/tasks/what-are-the-ways-to-declare-a-function-in-javascript",{"name":190,"path":191,"isActive":79},"Что такое this в JavaScript?","/technical-interview/tasks/what-is-this-in-javascript",{"name":193,"path":194,"isActive":79},"Что такое Event Loop, как работает?","/technical-interview/tasks/what-is-an-event-loop-and-how-does-it-work",{"name":196,"path":197,"isActive":79},"Что будет, если вызвать typeof на необъявленной переменной?","/technical-interview/tasks/what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":199,"path":200,"isActive":79},"Что показывает оператор typeof в JavaScript?","/technical-interview/tasks/what-does-the-typeof-operator-show-in-javascript",{"name":202,"path":203,"isActive":79},"Какие типы данных существует в JavaScript?","/technical-interview/tasks/what-types-of-data-exist-in-javascript",{"name":205,"path":206,"isActive":79},"Какую структуру использовать для хранения упорядоченного списка строк в JavaScript?","/technical-interview/tasks/what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":208,"path":209,"isActive":79},"Что вернет typeof для массива?","/technical-interview/tasks/what-will-typeof-return-for-an-array",{"name":211,"path":212,"isActive":79},"Почему оператор typeof, применённый к массиву, возвращает объект?","/technical-interview/tasks/why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":214,"path":215,"isActive":79},"Если нужно хранить список уникальных строк, какую структуру данных выбрать?","/technical-interview/tasks/if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":217,"path":218,"isActive":79},"Что возвращает typeof для new Set в JavaScript?","/technical-interview/tasks/what-does-typeof-return-for-new-set-in-javascript",{"name":220,"path":221,"isActive":79},"Почему в JavaScript два объекта с одинаковым содержимым при сравнении возвращают false?","/technical-interview/tasks/why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":223,"path":224,"isActive":79},"В чем разница между микро- и макро-тасками в JavaScript?","/technical-interview/tasks/what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":226,"path":227,"isActive":79},"arr.push(0) повлияет на массив так же, как если бы мы выполнили...","/technical-interview/tasks/arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":229,"path":230,"isActive":79},"Вернуть массив от 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":232,"path":233,"isActive":79},"Дана строка: '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":235,"path":236,"isActive":79},"Дано дерево (вложенный объект), надо найти сумму всех вершин","/technical-interview/tasks/given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":238,"path":239,"isActive":79},"Для каждого вложенного объекта нужно добавить свойство level, которое равняется числу - номер вложенности","/technical-interview/tasks/for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":241,"path":242,"isActive":79},"Для каждой ветви дерева записать номер вложенности данной ветви","/technical-interview/tasks/for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":244,"path":245,"isActive":79},"Есть массив, в котором лежат объекты с датами, необходимо отсортировать даты по возрастанию","/technical-interview/tasks/there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":247,"path":248,"isActive":79},"Есть слова в массиве, необходимо определить, состоят ли они из одних и тех же букв","/technical-interview/tasks/there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":250,"path":251,"isActive":79},"Есть строка, состоящая из разных скобок, необходимо проверить, закрыты ли все","/technical-interview/tasks/there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":253,"path":254,"isActive":79}," Найти в массиве неповторяющиеся числа","/technical-interview/tasks/find-non-repeating-numbers-in-an-array",{"name":256,"path":257,"isActive":79},"Напишите функцию, который сделает из массива объект","/technical-interview/tasks/write-a-function-that-will-make-an-object-out-of-an-array",{"name":259,"path":260,"isActive":79},"Необходимо проверить, являются ли две строки анаграммами друг друга","/technical-interview/tasks/checks-whether-two-strings-are-anagrams-of-each-other",{"name":262,"path":263,"isActive":79},"Нечётные числа должны отсортироваться по возрастанию, а чётные должны остаться на своих местах","/technical-interview/tasks/odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":265,"path":266,"isActive":79},"Определить, является ли слово палиндромом","/technical-interview/tasks/determines-whether-a-word-is-a-palindrome",{"name":7,"path":268,"isActive":79},"/technical-interview/tasks/flattening-the-array",{"name":270,"path":271,"isActive":79},"Реализовать функцию, принимающую аргументы \"*\", \"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":273,"path":274,"isActive":79},"Сжатие строк","/technical-interview/tasks/string-compression",{"name":276,"path":277,"isActive":79},"Уникализация значений в массиве","/technical-interview/tasks/unifying-values-in-an-array",{"name":279,"path":280,"isActive":79},"Числа от 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":282,"list":283,"isOpened":79},"React",[284,287,290,293,296,299,302],{"name":285,"path":286,"isActive":79},"Для чего нужен React, какие он решает проблемы?","/technical-interview/tasks/what-is-react-used-for-and-what-problems-does-it-solve",{"name":288,"path":289,"isActive":79},"Какой механизм лежит в основе оптимизации обновлений DOM в React?","/technical-interview/tasks/what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":291,"path":292,"isActive":79},"Если убрать в 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":294,"path":295,"isActive":79},"Есть блок кода. Что в реальном DOM изменится после нажатия на кнопку?","/technical-interview/tasks/there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":297,"path":298,"isActive":79},"Есть код, в котором список и кнопка. Что в реальном 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":300,"path":301,"isActive":79},"Зачем нужен 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":303,"path":304,"isActive":79},"Что мешает организовать централизованное состояние без менеджера состояния? Если организовать состояние механизмами реакта: контекстом, стейтом, в чем проблема? Что менеджеры состояния привносят?","/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":306,"list":307,"isOpened":79},"Алгоритмы",[308,311],{"name":309,"path":310,"isActive":79},"Что такое алгоритмическая сложность?","/technical-interview/tasks/what-is-algorithmic-complexity",{"name":312,"path":313,"isActive":79},"Какая алгоритмическая сложность у \"быстрой сортировки\"?","/technical-interview/tasks/what-is-the-algorithmic-complexity-of-quick-sort",{"title":315,"list":316,"isOpened":79},"Дебаггинг",[317],{"name":318,"path":319,"isActive":79},"Как диагностировать и исправить нежелательное изменение цвета фона по клику на кнопку, если исходный код сайта запутан и недоступен для прямого чтения?","/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":321,"list":322,"isOpened":79},"Компьютерные сети",[323,326,329,332,335,338,341,344,347,350,353,356,359,362,365,368,371,374,377,380],{"name":324,"path":325,"isActive":79},"Как браузер после ввода домена понимает, откуда брать сайт?","/technical-interview/tasks/how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":327,"path":328,"isActive":79},"Что такое DNS, как DNS находит нужный IP-адрес?","/technical-interview/tasks/what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":330,"path":331,"isActive":79},"Как домен попадает в DNS в таблицу соответствия: домен – ip","/technical-interview/tasks/how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":333,"path":334,"isActive":79},"Как браузер решает, какое соединение ему открывать, TCP или UDP?","/technical-interview/tasks/how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":336,"path":337,"isActive":79},"Ключевые отличия TCP и UDP","/technical-interview/tasks/key-differences-between-tcp-and-udp",{"name":339,"path":340,"isActive":79},"\"TCP/IP\" - кем является TCP, а кем IP в данном случае?","/technical-interview/tasks/tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":342,"path":343,"isActive":79},"Что такое HTTP и из чего состоит?","/technical-interview/tasks/what-is-http-and-what-does-it-consist-of",{"name":345,"path":346,"isActive":79},"Что такое заголовки в HTTP и зачем они нужны?","/technical-interview/tasks/what-are-http-headers-and-why-do-we-need-them",{"name":348,"path":349,"isActive":79},"Что такое параметры в HTTP?","/technical-interview/tasks/what-are-http-parameters",{"name":351,"path":352,"isActive":79},"Где находится HTML-код в структуре HTTP-ответа?","/technical-interview/tasks/where-is-the-html-code-located-in-the-http-response-structure",{"name":354,"path":355,"isActive":79},"Чем отличаются 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":357,"path":358,"isActive":79},"Пользователь авторизован на сайте. Как сервер узнает об этом с последующими другими заходами, что «я – авторизованный пользователь»?","/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":360,"path":361,"isActive":79},"Что такое cookie?","/technical-interview/tasks/what-is-a-cookie",{"name":363,"path":364,"isActive":79},"Кто является инициатором записи cookie в браузере?","/technical-interview/tasks/who-initiates-the-cookie-recording-in-the-browser",{"name":366,"path":367,"isActive":79},"Есть ли возможность с клиента (с браузера) управлять cookie?","/technical-interview/tasks/is-it-possible-to-manage-cookies-from-the-client-browser",{"name":369,"path":370,"isActive":79},"Верно ли утверждение, что злоумышленник, контролирующий роутер и прослушивающий трафик, может получить логины и пароли от сайтов, на которые заходит клиент?","/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":372,"path":373,"isActive":79},"Всё, что идет по HTTPS – оно защищено?","/technical-interview/tasks/is-everything-that-goes-through-https-secure",{"name":375,"path":376,"isActive":79},"Все данные зашифрованы, используется 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":378,"path":379,"isActive":79},"Есть веб-приложение. Помимо 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":381,"path":382,"isActive":79},"Каким способом может выполняться авторизация пользователя на сайте?","/technical-interview/tasks/how-can-a-user-be-authorized-on-a-website",{"title":384,"list":385,"isOpened":79},"Отрисовка в браузере",[386,389,392,395,398,401],{"name":387,"path":388,"isActive":79},"Что происходит, когда 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":390,"path":391,"isActive":79},"Как браузер парсит JavaScript и изображения при рендеринге?","/technical-interview/tasks/how-the-browser-parses-javascript-and-images-when-rendering",{"name":393,"path":394,"isActive":79},"Что в браузере блокирует рендеринг страницы?","/technical-interview/tasks/what-is-blocking-the-page-rendering-in-the-browser",{"name":396,"path":397,"isActive":79},"Что такое DOM в браузере? Что такое CSSOM?","/technical-interview/tasks/what-is-dom-in-a-browser-what-is-cssom",{"name":399,"path":400,"isActive":79},"Что является узлами в DOM?","/technical-interview/tasks/what-are-nodes-in-the-dom",{"name":402,"path":403,"isActive":79},"Из чего состоит CSSOM?","/technical-interview/tasks/what-does-cssom-consist-of",{"title":405,"list":406,"isOpened":79},"Ревью кода",[407],{"name":408,"path":409,"isActive":79},"По каким характеристикам, ревьюер понимает, что данный код - хороший, а этот код - плохой?","/technical-interview/tasks/how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"title":411,"list":412,"isOpened":79},"Теория вероятности",[413,416,419],{"name":414,"path":415,"isActive":79},"В комнате три человека. Какова вероятность того, что хотя бы двое из них одного пола? То есть два и более.","/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":417,"path":418,"isActive":79},"Есть монета. Ее подбрасывают пять раз подряд. Каждый раз записывается, что выпало - орел или решка. Сколько разных последовательностей орлов и решек может при этом получиться?","/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":420,"path":421,"isActive":79},"Как гарантированно найти лёгкую фальшивую монету среди 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":423},[424,427,429,431,433,436,439,441,443,445,447,449,452,454,456,458,460,462,464,466,468,470,472,474,476,478,480,482,484,486,488,490,492,494,496,498,500,502,504,506,508,510,512,514,516,518,520,522,524,526,528,530,532,534,536,538,540,542,544,546,548,550,552,554,556,558,560,562,564,566,568,570,572,574,576,578,580,582,584,586,588,590,592,594,596,598,600,602,604,606,608,610,612,614,616,618,620,622,624,626,628,630,632,633,635,637,639,641],{"name":425,"value":426},"Теоретические задания","theoretical-tasks",{"name":181,"value":428},"what-this-code-will-return-typeof-function",{"name":80,"value":430},"where-to-begin",{"name":148,"value":432},"why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":434,"value":435},"Backend","backend",{"name":437,"value":438},"Frontend","frontend",{"name":145,"value":440},"prototype-what-logical-values-will-be-received-in-console-log",{"name":262,"value":442},"odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":253,"value":444},"find-non-repeating-numbers-in-an-array",{"name":226,"value":446},"arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":232,"value":448},"the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":450,"value":451},"Реализовать функцию, похоже как в Jquery","implement-a-function-similar-to-jquery",{"name":238,"value":453},"for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":154,"value":455},"what-value-will-the-console-output-with-object-property",{"name":157,"value":457},"what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":229,"value":459},"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":259,"value":461},"checks-whether-two-strings-are-anagrams-of-each-other",{"name":265,"value":463},"determines-whether-a-word-is-a-palindrome",{"name":244,"value":465},"there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":270,"value":467},"implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":235,"value":469},"given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":241,"value":471},"for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":247,"value":473},"there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":279,"value":475},"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":250,"value":477},"there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":256,"value":479},"write-a-function-that-will-make-an-object-out-of-an-array",{"name":160,"value":481},"what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":163,"value":483},"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":175,"value":485},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":178,"value":487},"what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":276,"value":489},"unifying-values-in-an-array",{"name":7,"value":491},"flattening-the-array",{"name":166,"value":493},"what-will-the-book-get-upper-name-method-return",{"name":273,"value":495},"string-compression",{"name":172,"value":497},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":184,"value":499},"what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":324,"value":501},"how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":330,"value":503},"how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":333,"value":505},"how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":336,"value":507},"key-differences-between-tcp-and-udp",{"name":339,"value":509},"tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":342,"value":511},"what-is-http-and-what-does-it-consist-of",{"name":345,"value":513},"what-are-http-headers-and-why-do-we-need-them",{"name":348,"value":515},"what-are-http-parameters",{"name":351,"value":517},"where-is-the-html-code-located-in-the-http-response-structure",{"name":139,"value":519},"what-is-html",{"name":354,"value":521},"what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":357,"value":523},"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":360,"value":525},"what-is-a-cookie",{"name":363,"value":527},"who-initiates-the-cookie-recording-in-the-browser",{"name":366,"value":529},"is-it-possible-to-manage-cookies-from-the-client-browser",{"name":531,"value":56},"Лайвкодинг",{"name":151,"value":533},"what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":372,"value":535},"is-everything-that-goes-through-https-secure",{"name":375,"value":537},"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":378,"value":539},"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":390,"value":541},"how-the-browser-parses-javascript-and-images-when-rendering",{"name":387,"value":543},"what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":393,"value":545},"what-is-blocking-the-page-rendering-in-the-browser",{"name":396,"value":547},"what-is-dom-in-a-browser-what-is-cssom",{"name":399,"value":549},"what-are-nodes-in-the-dom",{"name":402,"value":551},"what-does-cssom-consist-of",{"name":100,"value":553},"the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":103,"value":555},"there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":106,"value":557},"there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":109,"value":559},"there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":112,"value":561},"there-is-an-html-code-will-font-weight-affect-span",{"name":115,"value":563},"what-are-the-differences-between-flexbox-and-grid",{"name":118,"value":565},"do-flexbox-and-grid-replace-each-other",{"name":121,"value":567},"there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"name":84,"value":569},"tasks",{"name":187,"value":571},"what-are-the-ways-to-declare-a-function-in-javascript",{"name":190,"value":573},"what-is-this-in-javascript",{"name":193,"value":575},"what-is-an-event-loop-and-how-does-it-work",{"name":196,"value":577},"what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":199,"value":579},"what-does-the-typeof-operator-show-in-javascript",{"name":202,"value":581},"what-types-of-data-exist-in-javascript",{"name":205,"value":583},"what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":208,"value":585},"what-will-typeof-return-for-an-array",{"name":211,"value":587},"why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":214,"value":589},"if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":217,"value":591},"what-does-typeof-return-for-new-set-in-javascript",{"name":285,"value":593},"what-is-react-used-for-and-what-problems-does-it-solve",{"name":291,"value":595},"if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":294,"value":597},"there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":297,"value":599},"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":300,"value":601},"why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":318,"value":603},"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":127,"value":605},"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":130,"value":607},"git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":133,"value":609},"what-are-the-branching-strategies-for-the-team-what-is-it",{"name":408,"value":611},"how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"name":91,"value":613},"here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":94,"value":615},"here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"name":309,"value":617},"what-is-algorithmic-complexity",{"name":312,"value":619},"what-is-the-algorithmic-complexity-of-quick-sort",{"name":220,"value":621},"why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":381,"value":623},"how-can-a-user-be-authorized-on-a-website",{"name":223,"value":625},"what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":414,"value":627},"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":417,"value":629},"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":420,"value":631},"how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"name":73,"value":74},{"name":369,"value":634},"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":327,"value":636},"what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":169,"value":638},"variables-are-declared-as-follows-specify-the-correct-statement",{"name":288,"value":640},"what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":303,"value":642},"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":644,"copyright":647,"reportError":648,"socialNetwork":650},{"link":645,"title":646},"https://t.me/baurinanton","Сотрудничество","© “GOOD WEB JOB!”",{"label":649,"link":645},"Сообщить об ошибке",{"label":651,"socialNetworkList":652},"Мы в соцсетях:",[653,656,659],{"icon":61,"link":654,"title":655},"https://max.ru/u/f9LHodD0cOKMaukdnnahTeL5pwvjrPfUaZ4S8_1rsNy9I9qsmc9Ar3kP_y8","Max",{"icon":657,"link":645,"title":658},"ic:baseline-telegram","Telegram",{"icon":660,"link":661,"title":662},"ri:vk-fill","https://vk.com/baurinanton","VK",{"data":664,"body":665},{},{"type":666,"children":667},"root",[668,676,689,694,699],{"type":669,"tag":670,"props":671,"children":672},"element","p",{},[673],{"type":674,"value":675},"text","Дан массив:",{"type":669,"tag":677,"props":678,"children":682},"pre",{"className":679,"code":681,"language":674},[680],"language-text","const arr = [1, [2, [3, [4,5]]]]\n",[683],{"type":669,"tag":684,"props":685,"children":687},"code",{"__ignoreMap":686},"",[688],{"type":674,"value":681},{"type":669,"tag":670,"props":690,"children":691},{},[692],{"type":674,"value":693},"Необходимо написать функцию, которая принимает в аргументах многомерный массив\nнеограниченной вложенности и возвращает одномерный массив, состоящий\nиз элементов со всех уровней вложенности исходного массива.",{"type":669,"tag":670,"props":695,"children":696},{},[697],{"type":674,"value":698},"Примеры:",{"type":669,"tag":677,"props":700,"children":703},{"className":701,"code":702,"language":674},[680],"flat([1, [2, [3, [4,5]]]]); // => [1, 2, 3, 4, 5]\nflat([1, [2, [3, [4,5,[6,[7]]]]]]); // => [1, 2, 3, 4, 5, 6, 7]\n",[704],{"type":669,"tag":684,"props":705,"children":706},{"__ignoreMap":686},[707],{"type":674,"value":702},{"data":709,"body":710},{},{"type":666,"children":711},[712,717,722,737,742,751,756],{"type":669,"tag":670,"props":713,"children":714},{},[715],{"type":674,"value":716},"Многомерный массив можно представить как дерево: узлы — это массивы, а «листья» — это не-массивные значения (числа, строки, объекты и т.д.). Задача «сделать плоский массив» означает выполнить обход этого дерева слева направо и собрать все листья в один линейный список.",{"type":669,"tag":670,"props":718,"children":719},{},[720],{"type":674,"value":721},"На практике чаще всего используется обход в глубину (DFS):",{"type":669,"tag":723,"props":724,"children":725},"ul",{},[726,732],{"type":669,"tag":727,"props":728,"children":729},"li",{},[730],{"type":674,"value":731},"Если встречается массив, требуется зайти внутрь и обработать элементы по порядку.",{"type":669,"tag":727,"props":733,"children":734},{},[735],{"type":674,"value":736},"Если встречается не-массив, требуется добавить значение в результат.",{"type":669,"tag":670,"props":738,"children":739},{},[740],{"type":674,"value":741},"Базовая схема (псевдокод) выглядит так:",{"type":669,"tag":677,"props":743,"children":746},{"className":744,"code":745,"language":674},[680],"walk(value):\n  если value — массив:\n    для каждого элемента item в value:\n      walk(item)\n  иначе:\n    добавить value в result\n",[747],{"type":669,"tag":684,"props":748,"children":749},{"__ignoreMap":686},[750],{"type":674,"value":745},{"type":669,"tag":670,"props":752,"children":753},{},[754],{"type":674,"value":755},"По сложности:",{"type":669,"tag":723,"props":757,"children":758},{},[759,764],{"type":669,"tag":727,"props":760,"children":761},{},[762],{"type":674,"value":763},"По времени все корректные реализации работают за O(n), где n — общее количество элементов на всех уровнях (каждый элемент посещается один раз).",{"type":669,"tag":727,"props":765,"children":766},{},[767],{"type":674,"value":768},"По памяти: результат занимает O(n); дополнительная память зависит от подхода, рекурсия требует глубины стека O(d), итеративный стек также хранит до O(d) (и иногда больше, в зависимости от формы вложенности).",{"data":770,"body":771},{},{"type":666,"children":772},[773,778,791,818,823,852,857],{"type":669,"tag":670,"props":774,"children":775},{},[776],{"type":674,"value":777},"Частая ошибка — «раскрыть» массив только на один уровень (например, через поверхностное объединение), хотя по условию требуется раскрывать до конца, независимо от глубины. Это означает, что проверка и обработка должны повторяться, пока внутри не останутся только не-массивные элементы.",{"type":669,"tag":670,"props":779,"children":780},{},[781,783,789],{"type":674,"value":782},"Ещё одна ошибка — неверная проверка «это массив или нет». Для этой задачи корректная проверка — ",{"type":669,"tag":684,"props":784,"children":786},{"className":785},[],[787],{"type":674,"value":788},"Array.isArray(value)",{"type":674,"value":790},", так как:",{"type":669,"tag":723,"props":792,"children":793},{},[794,813],{"type":669,"tag":727,"props":795,"children":796},{},[797,803,805,811],{"type":669,"tag":684,"props":798,"children":800},{"className":799},[],[801],{"type":674,"value":802},"typeof []",{"type":674,"value":804}," возвращает \"object\", поэтому ",{"type":669,"tag":684,"props":806,"children":808},{"className":807},[],[809],{"type":674,"value":810},"typeof",{"type":674,"value":812}," не подходит.",{"type":669,"tag":727,"props":814,"children":815},{},[816],{"type":674,"value":817},"Строки и обычные объекты не должны раскрыться как массив, иначе будет ломаться смысл задачи.",{"type":669,"tag":670,"props":819,"children":820},{},[821],{"type":674,"value":822},"Полезно заранее определить, что считается элементом:",{"type":669,"tag":723,"props":824,"children":825},{},[826,847],{"type":669,"tag":727,"props":827,"children":828},{},[829,831,837,839,845],{"type":674,"value":830},"Если внутри встречаются ",{"type":669,"tag":684,"props":832,"children":834},{"className":833},[],[835],{"type":674,"value":836},"null",{"type":674,"value":838}," и ",{"type":669,"tag":684,"props":840,"children":842},{"className":841},[],[843],{"type":674,"value":844},"undefined",{"type":674,"value":846},", они должны попадать в результат как обычные значения (если не задано иное).",{"type":669,"tag":727,"props":848,"children":849},{},[850],{"type":674,"value":851},"Если внутри встречаются функции или объекты, они также должны попадать в результат как есть (если не задано иное).",{"type":669,"tag":670,"props":853,"children":854},{},[855],{"type":674,"value":856},"Небольшая таблица выбора подхода:",{"type":669,"tag":858,"props":859,"children":860},"table",{},[861,890],{"type":669,"tag":862,"props":863,"children":864},"thead",{},[865],{"type":669,"tag":866,"props":867,"children":868},"tr",{},[869,875,880,885],{"type":669,"tag":870,"props":871,"children":872},"th",{},[873],{"type":674,"value":874},"Подход",{"type":669,"tag":870,"props":876,"children":877},{},[878],{"type":674,"value":879},"Плюсы",{"type":669,"tag":870,"props":881,"children":882},{},[883],{"type":674,"value":884},"Минусы",{"type":669,"tag":870,"props":886,"children":887},{},[888],{"type":674,"value":889},"Когда уместен",{"type":669,"tag":891,"props":892,"children":893},"tbody",{},[894,918,941,964],{"type":669,"tag":866,"props":895,"children":896},{},[897,903,908,913],{"type":669,"tag":898,"props":899,"children":900},"td",{},[901],{"type":674,"value":902},"Рекурсия",{"type":669,"tag":898,"props":904,"children":905},{},[906],{"type":674,"value":907},"Самая простая для понимания",{"type":669,"tag":898,"props":909,"children":910},{},[911],{"type":674,"value":912},"Возможен переполненный стек при большой глубине",{"type":669,"tag":898,"props":914,"children":915},{},[916],{"type":674,"value":917},"Учебные задачи, обычные входные данные",{"type":669,"tag":866,"props":919,"children":920},{},[921,926,931,936],{"type":669,"tag":898,"props":922,"children":923},{},[924],{"type":674,"value":925},"Итеративно (стек)",{"type":669,"tag":898,"props":927,"children":928},{},[929],{"type":674,"value":930},"Устойчиво к большой глубине",{"type":669,"tag":898,"props":932,"children":933},{},[934],{"type":674,"value":935},"Код сложнее рекурсии",{"type":669,"tag":898,"props":937,"children":938},{},[939],{"type":674,"value":940},"Очень глубокие структуры, «защитный» код",{"type":669,"tag":866,"props":942,"children":943},{},[944,949,954,959],{"type":669,"tag":898,"props":945,"children":946},{},[947],{"type":674,"value":948},"Генератор",{"type":669,"tag":898,"props":950,"children":951},{},[952],{"type":674,"value":953},"Удобно отделять обход и потребление",{"type":669,"tag":898,"props":955,"children":956},{},[957],{"type":674,"value":958},"Может быть рекурсивным и иметь те же риски",{"type":669,"tag":898,"props":960,"children":961},{},[962],{"type":674,"value":963},"Знакомство с yield, большие наборы данных",{"type":669,"tag":866,"props":965,"children":966},{},[967,972,977,982],{"type":669,"tag":898,"props":968,"children":969},{},[970],{"type":674,"value":971},"flat(Infinity)",{"type":669,"tag":898,"props":973,"children":974},{},[975],{"type":674,"value":976},"Самое короткое решение",{"type":669,"tag":898,"props":978,"children":979},{},[980],{"type":674,"value":981},"Нужна поддержка среды или полифил",{"type":669,"tag":898,"props":983,"children":984},{},[985],{"type":674,"value":986},"Современные браузеры/Node.js, без требований к старым",{"data":988,"body":989},{},{"type":666,"children":990},[991],{"type":669,"tag":670,"props":992,"children":993},{},[994],{"type":674,"value":25},1775575822720]