Да. На первом шаге итерации Mammals добавляется в itemsById. В itemsById ищется родитель для Mammals, но т.к. в itemsById пока что есть только Mammals, а элемента с id == 0 вообще нет в исходном наборе, то срабатывает else и Mammals попадает в result. На втором шаге все повторяется до проверки. Для Dogs в itemsById находится родитель — это Mammals. Далее в Mammals.children пушится Dogs. Цикл повторяется.
Объекты в js передаются только по ссылке. И когда в цикле в первый раз делается itemsById[item[parentid]][children].push(item), это эквивалентно result[0][children].push(item), потому что и result[0] и itemsById[item[parentid]] ссылаются на Mammals.
|