Вам понадобится функция, которая сначала найдет самый глубокий узел:
/**
* Return [depth, item] where item is the deepest subnode of node.
*/
function find_deepest(node, depth=0) {
if (node.items.length === 0) return [depth, node];
return node.items.map(child => find_deepest(child, depth+1)).sort().reverse()[0];
}
, затем просто:
const [depth, node] = find_deepest(obj, 0);
node.items.push({...});
update: только что понял, что ваш obj
- это список, поэтому с приведенным выше кодом он будет выглядеть так:
const [depth, node] = obj.map(child => find_deepest(child)).sort().reverse()[0]);
, который не является лучшим интерфейсом.
Разделение рекурсии на две функции, одну для случая узла и одну для случая массива, и оборачивание их в функцию, ответвляющуюся по типу, даст вам лучший интерфейс:
console.log(find_deepest(obj));
Подробности смотрите во фрагменте ниже (я расширил ваш объект второй веткой с пустыми элементами:
var obj = [{
"name": "111", "type": "folder", "expanded": true, "id": 0, "itemIndex": 0, "index": 0,
"items": [{
"name": "222", "type": "folder", "expanded": true, "id": 1, "itemIndex": 0, "index": 0,
"items": [{
"name": "333", "type": "folder", "expanded": true, "id": 2, "itemIndex": 0, "index": 0,
"items": [{
"name": "444", "type": "folder", "expanded": true, "id": 3,"itemIndex": 0, "index": 0,
"items": []
}],
}, {
"name": "555", "type": "folder", "expanded": true, "id": 3,"itemIndex": 0, "index": 0,
"items": [{
"name": "666", "type": "folder", "expanded": true, "id": 3,"itemIndex": 0, "index": 0,
"items": [{
"name": "777", "type": "folder", "expanded": true, "id": 3,"itemIndex": 0, "index": 0,
"items": [],
}]
}]
}]
}]
}];
function find_deepest(val, depth=0) {
function _find_deepest_node(node, depth) {
if (node.items.length === 0) return [depth, node];
return _find_deepest_array(node.items, depth + 1);
}
function _find_deepest_array(arr, depth) {
return arr.map(child => _find_deepest_node(child, depth)).sort().reverse()[0];
}
if (Array.isArray(val)) {
return _find_deepest_array(val, depth)[1]; // get the node, not the depth..
} else {
return _find_deepest_node(val, depth)[1];
}
}
console.log(find_deepest(obj));