Как сгладить вложенные объекты в машинописном тексте?

#javascript #typescript

Вопрос:

Я пытаюсь сгладить следующий объект «необработанный» в объект «плоский»

 raw = [    {
      "id":"123",
      "Date":"12/12/2020",
      "Type":{
         "id":"456",
         "desc":"test1"
      }    },    {
      "id":"124",
      "Date":"12/12/2020",
      "Type":{
         "id":"456",
         "desc":"test2"
      }    } ]
 
 flat =[   {
      "id":"123",
      "Date":"12/12/2020",
      "desc":"test1"
      },    
      {
      "id":"124",
      "Date":"12/12/2020",
      "desc":"test2"
      }]
 

Я попытался сделать следующее:

 
   let flatData:any = []
    const flattenObject = (obj:any) => {
      const flattened:any = {}
    
      Object.keys(obj).forEach((key) => {
        if (typeof obj[key] === 'object' amp;amp; obj[key] !== null) {
          Object.assign(flattened, flattenObject(obj[key]))
        } else {
          flattened[key] = obj[key]
        }
      })
      flatData.push(flattened)
      console.log(flattened)
      return flattened
    }

 

Результат, который я получаю из приведенного выше фрагмента кода.

введите описание изображения здесь

……………………………………………………………………………….

Ответ №1:

Вы можете использовать деструкцию объектов в TypeScript.

 const raw = [{
  "id": "123",
  "Date": "12/12/2020",
  "Type": {  "id": "456",  "desc": "test1" }
}, {
  "id": "124",
  "Date": "12/12/2020",
  "Type": {  "id": "456", "desc": "test2" }
}];

const mapped = raw.map(({ id, Date, Type: { desc } }) => ({ id, Date, desc }));

console.log(mapped); 
 .as-console-wrapper { top: 0; max-height: 100% !important; } 

Ответ №2:

Функция, которую вы используете для выравнивания объекта, верна, однако вложенное id свойство в Type свойстве имеет то же имя свойства id , что и свойство верхнего уровня. Когда вы выравниваете объект, это значение верхнего уровня id перезаписывается вложенным id значением.

Решения:

  1. Если у вас есть контроль над данными, вы можете переименовать вложенное id свойство во что-то другое.
  2. В flattenObject функции вы можете префиксировать вложенное свойство именем родительского свойства. т. е.
 const flattenObject = (obj:any, prefix = '') => {
      const flattened:any = {}
    
      Object.keys(obj).forEach((key) => {
        if (typeof obj[key] === 'object' amp;amp; obj[key] !== null) {
          Object.assign(flattened, flattenObject(obj[key], prefix))
        } else {
          flattened[prefix   key] = obj[key]
        }
      })
      flatData.push(flattened)
      return flattened
 

Ответ №3:

Вот решение, которое работает, если у вас есть только один уровень глубины и если вы хотите сгладить объекты, независимо от того, каково имя свойства:

 const raw = [
  {
    id: "123",
    Date: "12/12/2020",
    Type: {
      id: "456",
      desc: "test1",
    },
  },
  {
    id: "124",
    Date: "12/12/2020",
    Type: {
      id: "456",
      desc: "test2",
    },
  },
];

const flatten = (obj) =>
  Object.assign(
    {},
    Object.fromEntries(
      Object.values(obj)
        .filter((x) => typeof x === "object")
        .map((x) => Object.entries(x))
        .flat(1)
    ),
    Object.fromEntries(
      Object.entries(obj).filter(([, x]) => typeof x !== "object")
    )
  );

const compute = (data) => data.map(flatten);

console.log(compute(raw)); 

Комментарии:

1. Значение верхнего уровня id перезаписывается вложенным id значением.