Как вы получаете все значения в объекте, используя ramda - PullRequest
1 голос
/ 28 января 2020

как вы сопоставляете все объекты и получаете все значения, используя ramda

const input ={
  a: 'apple',
  b:{
    c:{
      d:{
        e: 'egg',
        f: 'fish'
      }
    },
    g: 'guava',
    h: 'honey',
  }
}

console.log:

['apple',
'egg',
'fish',
'guava',
'honey']

Ответы [ 2 ]

2 голосов
/ 28 января 2020

Вы можете использовать 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, которая делает то же самое:

  1. Получить значения,
  2. Использовать 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>
1 голос
/ 28 января 2020

Не нужно использовать Рамду, вы можете сделать это по плану JS за один умно написанный рекурсив уменьшить :

const getDeepValues = obj => Object
  .values(obj) // 1. iterate over the object values
  .reduce((acc, cur) => [
    ...acc, // 3. pass previous values
    ...(
      cur instanceof Object // 4. if the value we encounter is an object...
      ? getDeepValues(cur)  // ...then use recursion to add all deep values
      : [cur]               // ...else add one string
    ),
  ], []); // 2. start with an empty array
  
const input ={
  a: 'apple',
  b:{
    c:{
      d:{
        e: 'egg',
        f: 'fish'
      }
    },
    g: 'guava',
    h: 'honey',
  }
}

console.log(getDeepValues(input))
...