Рекурсия есть:
const getPrimitives = data =>
data instanceof Object
? Object.values(data).flatMap(getPrimitives)
: [ data ];
const result = getPrimitives(obj);
или
function* getPrimitives(data) {
if (data instanceof Object) {
for (const k in data) if (data.hasOwnProperty(k)) {
yield* getPrimitives(data[k]);
}
} else {
yield data;
}
}
const result = [...getPrimitives(obj)];
Рекурсии нет:
function getNestedData(data, test) {
const result = [];
for (const stack = [ data ]; stack.length;) {
const n = stack.pop();
if (n instanceof Object) {
stack.push(...Object.values(n).reverse());
}
if (test(n)) {
result.push(n);
}
}
return result;
}
const resutl = getNestedData(obj, x => x !== Object(x));