const obj2arr = (data, level) => { const dataKeys = "object" === typeof(data) && !Array.isArray(data) && Object.keys(data); let results = []; if (!!dataKeys) { for (let dataKey of dataKeys) { let obj = { name: dataKey } obj["values"] = data[dataKey] || null; if ("object" === typeof(data[dataKey]) && !Array.isArray(data[dataKey]) && data[dataKey] && "object" === typeof(data[dataKey]) && level > 0) { obj["values"] = obj2arr(data[dataKey], level); --level } ++level results = [...results, obj]; } } return results } let b = { a: [1, 2], b: 3, c: 'c', d: { d1: 'bla', d2: 'ble', d3: { e: 1, f: [1, 2], g: 'bli', h: { h1: 1, h2: 2 } } } }; res = obj2arr(b, 1); console.log(res);No debería tener esas instrucciones level++ y level-- . En su lugar, pase el level - 1 a la llamada recursiva:
obj["values"] = obj2arr(data[dataKey], level - 1); De esta manera, la condición que ya tiene ( level > 0 ) se asegurará de que solo se realice la transformación hasta el nivel dado.
No toqué nada más en tu código:
const obj2arr = (data, level) => { const dataKeys = "object" === typeof(data) && !Array.isArray(data) && Object.keys(data); let results = []; if (!!dataKeys) { for (let dataKey of dataKeys) { let obj = { name: dataKey } obj["values"] = data[dataKey] || null; if ("object" === typeof(data[dataKey]) && !Array.isArray(data[dataKey]) && data[dataKey] && "object" === typeof(data[dataKey]) && level > 0) { obj["values"] = obj2arr(data[dataKey], level - 1); } results = [...results, obj]; } } return results } let b = { a: [1, 2], b: 3, c: 'c', d: { d1: 'bla', d2: 'ble', d3: { e: 1, f: [1, 2], g: 'bli', h: { h1: 1, h2: 2 } } } }; res = obj2arr(b, 1); console.log(res);