id 2 - Свинина (Пункт)
parent_id 2 - Живойвес (Подпункт)
parent_id 3 - Мелковес (Подпункт 3-го уровня)
Не уверен, что это правильно. Вернее уверен, что ты неправильно это понимаешь: parent_id 2 это подпункт для меню итема с id 2, а не второго уровня(в данном случае он второго уровня, но это просто совпадение). parent_id 3 это подпункт для меню итема с id 3, а не третьего уровня. У тебя же там не будет меню вложенностью в 16 пунктов, верно?)
Напиши ответ из базы, джейсон или что там будет, тогда накидаю вывод разметки.
Update. Держи:
let ul = '<ul>';
for (let i = 0; i < arr.length; i++) {
let item = arr[i];
ul += '<li>' + item.title + '</li>';
for (let j = 0; j < item.children.length; j++) {
let child = item.children[j];
if (j === 0) {
ul += '<ul>';
}
ul += '<li>' + child.title + '</li>';
if (child.children) {
for (let k = 0; k < child.children.length; k++) {
let child2 = child.children[k];
if (k === 0) {
ul += '<ul>';
}
ul += '<li>' + child2.title + '</li>';
if (child2.children) {
for (let n = 0; n < child2.children.length; n++) {
let child3 = child2.children[n];
if (n === 0) {
ul += '<ul>';
}
ul += '<li>' + child3.title + '</li>';
if (n === child2.children.length - 1) {
ul += '</ul>';
}
}
}
if (k === child.children.length - 1) {
ul += '</ul>';
}
}
}
if (j === item.children.length - 1) {
ul += '</ul>';
}
}
}
ul += '</ul>';
document.body.innerHTML = ul;
Проверяй уже сам, всё ли правильно.