Hodilo by se vidět i to pole, který má funkce test() procházet. Jinak mi to připadá jako nějaká rekurze, na řádku č. 6 voláš uvnitř funkce test() funkci test().
arr.push(test(obj.parid));
Co mi dál není jasný, že ve funkci test(id) máš v podmínce obj.catid, ale pak tu samou funkci voláš s jiným (?) klíčem objektu, test(obj.parid).
Prostě mi to bez toho pole není jasný.