const myObj = { id: 1, anyProp: [{ id: 2, thing: { a: 1, id: 10 }, children: [{ id: 3 }] }, { id: 4, children: [{ id: 5, children: [{ id: 6, children: [{ id: 7 }] }] }] }] }; const getValues = prop => obj => { if (!Object.keys(obj).length) { return []; } return Object.entries(obj).reduce((acc, [key, val]) => { if (key === prop) { acc.push(val); } else { acc.push(Array.isArray(val) ? val.map(getIds).flat() : getIds(val)); } return acc.flat(); }, []); } const getIds = getValues('id'); console.log(getIds(myObj));