У меня есть объект, похожий на тот, что ниже:
const obj = {
"test1": {
"test12": "val1",
"test13": {
"test131": "val1",
"test132": "val2"
}
},
"test2": "val2"
}
Я хочу получить ключи следующим образом:
const keys = [["test1", "test12", "test13", "test131", "test132"], ["test2"]];



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ну вот:
const obj = {
"test1": {
"test12": "val1",
"test13": {
"test131": "val1",
"test132": "val2"
}
},
"test2": "val2"
};
const mapToKeys = ([key, value]) => {
if (Object.prototype.toString.call(value) === '[object Object]') {
return [key, ...getKeys(value)];
}
return [key];
};
const getKeys = (o) => Object.entries(o).flatMap(mapToKeys);
const keys = Object.entries(obj).map(mapToKeys);
console.info(keys);Вы можете рекурсивно обрабатывать записи в объекте, собирая ключи по мере продвижения и сглаживая массивы результатов на всех уровнях, кроме верхнего:
const obj = {
"test1": {
"test12": "val1",
"test13": {
"test131": "val1",
"test132": "val2"
}
},
"test2": null,
"test3": {
"test31": "val3"
},
"test4": {
"test41": [1, 2, 3, 4]
}
}
const getKeys = (obj, flat = false) => {
const keys = Object.entries(obj)
.map(([k, v]) => v instanceof Object && !(v instanceof Array) ? [k, ...getKeys(v, true)] : [k])
return flat ? keys.flat() : keys
}
const allKeys = getKeys(obj)
console.info(allKeys)Этот код выдаст ошибку, если одно из значений равно null, и может работать не так, как ожидалось, если одно из значений будет массивом.
@ViktorLuft спасибо, что указали на это. Я исправил код, чтобы убедиться, что он работает правильно в этих случаях.
что ты уже испробовал? Что не работает? Рекурсия и
Object.keysдолжны помочь здесь.