JSFiddle - React, Tailwind, and code Playground
JavaScript
var arr = [
{id: 1, idPai: null},
{id: 2, idPai: null},
{id: 11, idPai: 1},
{id: 12, idPai: 1},
{id: 21, idPai: 2},
{id: 22, idPai: 2},
{id: 23, idPai: 2},
{id: 121, idPai: 12},
{id: 122, idPai: 12},
{id: 123, idPai: 12},
{id: 124, idPai: 12}
];
var resultado = [];
function teste(arrEntrada, arrSaida){
for (let i = 0; i < arrEntrada.length; i++) {
let item = arrEntrada[i];
let obj = {
id: item.id,
filhos: []
};
let filhos = arr.filter(elemento => elemento.idPai === item.id);
teste(filhos, obj.filhos);
arrSaida.push(obj);
}
}
teste(arr.filter(elemento => elemento.idPai === null), resultado);
console.log(JSON.stringify(resultado));