Как сгладить obj в TS - PullRequest
       6

Как сгладить obj в TS

0 голосов
/ 13 июля 2020

Кстати проблему этого вопроса я уже решаю, но вопросов по этому поводу не нашел. И я решил загрузить сюда свой код, чтобы помочь парням вроде меня.

У меня есть такой объект:

{
  a: 'a',
  b: 'b',
  c: {
    ca: 'ca',
    obj: {
      key: 'val',
    }
  }
}

И мне нужно вот такое:

{
  a: 'a',
  b: 'b',
  ca: 'ca',
  key: 'val',
}

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Вы можете просто рекурсивно reduce() записи объекта:

const flatten = o => Object.entries(o).reduce((a, [k, v]) => ({
  ...a,
  ...typeof v === 'object' ? flatten(v) : {[k]: v}
}), {});

Полный фрагмент:

const data = {
  a: 'a',
  b: 'b',
  c: {
    ca: 'ca',
    obj: {
      key: 'val'
    }
  }
};

const flatten = o => Object.entries(o).reduce((a, [k, v]) => ({
  ...a,
  ...typeof v === 'object' ? flatten(v) : {[k]: v}
}), {});

console.log(flatten(data));
0 голосов
/ 13 июля 2020

Я написал функцию:

const flatObjMain = (element: ReferralPageNodeFragment) => {
    if (element) {
        const flatelement: IDataElementProps = {}
        const flatObj = (pieceObj: IDataElementProps) => {
            const keys = Object.keys(pieceObj)
            keys.forEach((key) => {
                if (typeof pieceObj[key] === 'object') {
                    flatObj(pieceObj[key])
                } else {
                    flatelement[key] = pieceObj[key]
                }
            })
        }
        flatObj(element)
        return flatelement
    }
    return undefined
}
...