Вы можете использовать Object.values()
и Array.flatMap()
для создания рекурсивной функции, которая получает значения от объекта, а затем выполняет итерацию значений и вызывает себя для каждого значения, являющегося объектом:
const getDeepValues = obj => Object
.values(obj)
.flatMap(v => typeof v === 'object' ? getDeepValues(v) : v)
const input = {"a":"apple","b":{"c":{"d":{"e":"egg","f":"fish"}},"g":"guava","h":"honey"}}
const result = getDeepValues(input)
console.log(result)
Вы можете создать функцию без точек с Ramda, которая делает то же самое:
- Получить значения,
- Использовать R. Если
R.is(Object)
проверить, является ли значение объектом, и вызвать getDeepValues
для значения, если оно есть (необходима функция стрелки, потому что getDeepValues
еще не объявлено), или вернуть значение, если оно не.
const { pipe, values, chain, when, is } = R
const getDeepValues = pipe(
values, // get the values
chain(when(is(Object), v => getDeepValues(v))) // if the value is an object use getDeepValues or just return the value
)
const input = {"a":"apple","b":{"c":{"d":{"e":"egg","f":"fish"}},"g":"guava","h":"honey"}}
const result = getDeepValues(input)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>