Собираем массив объектов 5/5

тут будет тяжко =)

рассмотрим 1ую итерацию внешнего цикла, на которой рассматривается 1ый массив из “массива массивов”
условие: пока есть элементы в этом массиве, мы перебираем ключи (внутренним циклом-j) и каждому ключу присваиваем соответствующий элемент массива (1ый ключ - 1 элем. массива, 2ой ключ - 2 элем. массива и т.д., пока не кончатся элементы массива). Соответственно если у нас кончились ключи, мы не сможем создать свойство объекта без ключа и ограничение в количестве элементов массива тоже выполняется (как исходное условие). Когда объект полностью наполнился ключами, он добавляется в массив array последним элементом.

на второй итерации внешнего цикла-i создается 2ой объект и т.д.

про чалика:
внутренний цикл тот же, что и у меня, с той лишь разницей, что значение length у него переменное, а именно придуман костыль:
перебрать ключи либо до длины мелкого массива значений, либо перебрать ключи до длины массива ключей, смотря что из этого будет меньше. Решение такое я считаю неоптимальным по той причине, что массив может быть очень интересной длины: к примеру, он может быть длиной 9 элементов, а реально в нем будет 0 элементов. выглядит он так: [,,,,,,,,]
то есть, будет не пустой объект, а объект с ключами и неопределенными значениями. Странно, что разрабы курса не добавили такой нюанс в проверку =)
попробуйте вызвать функцию с моим кодом и его кодом вот так:

getData(["name","growth","weight","age"],
[["Пётр","165","70"],["Василий","170"],["Светлана"], [,,,,,,,,]]);

и поймете разницу, о которой речь