Преобразование типизированного объекта в TypeScript

88
05 марта 2022, 11:50

Подскажите, пожалуйста, как в TypeScript obj преобразовать в newObj?

 interface Range {
  date: string;
  size: number;
  temp: [{
    name: string | null;
    text: string | null
  } | []];
}

let obj: Range[] = [{
    "date": "2020-01-20",
    "size": 8,
    "temp": [{
        "name": "aaa",
        "text": "AAA",
      },
      {
        "name": "bbb",
        "text": "BBB",
      },
      {
        "name": "ccc",
        "text": "CCC",
      }
    ]
  },
  {
    "date": "2020-01-21",
    "size": 7,
    "temp": []
  }
];
let newObj = [{
    "date": "2020-01-20",
    "size": 8,
    "prop": true,
    "name": "aaa",
    "text": "AAA"
  },
  {
    "date": "2020-01-20",
    "size": 8,
    "prop": true,
    "name": "bbb",
    "text": "BBB"
  },
  {
    "date": "2020-01-20",
    "size": 8,
    "prop": true,
    "name": "ccc",
    "text": "CCC"
  },
  {
    "date": "2020-01-21",
    "size": 7,
    "prop": false,
    "name": null,
    "text": null
  }
];
Answer 1

там песочница

разбираемся с типами

interface $range {
    date: string;
    size: number;
    temp: $temp;
}
type $rangeList = $range[];
interface $tempObj {
    name: string | null;
    text: string | null;
}
type $temp = $tempObj[];
// --> так
interface $rangeB {
    date: string;
    size: number;
    prop: boolean;
    name: $tempObj['name'];
    text: $tempObj['text'];
}
// или
// type $rangeB = Omit<$range, 'temp'> & $tempObj & { prop: boolean };
type $rangeBList = $rangeB[];

пишем ф-ии преобразования


type $range2rangeBList = (range: $range) => $rangeBList
const range2rangeBList: $range2rangeBList = range =>
    Array.from(range.temp, ({ name, text }) => ({
        name, text,
        date: range.date,
        size: range.size,
        prop: false,
    } as $rangeB))
const matrix2arr = (matrix: any[][]): any[] =>
    matrix.reduce((arr, q, i) => (arr.push(...matrix[i]),arr), [])
type $rangeList2rangeBList = (list: $rangeList) => $rangeBList
const rangeList2rangeBList: $rangeList2rangeBList = list =>
    matrix2arr(
        list.map(range2rangeBList)
    )

проверяем

let range: $rangeList = [
    {
        date: "2020-01-20",
        size: 8,
        temp: [{
            "name": "aaa",
            "text": "AAA",
        },
        {
            "name": "bbb",
            "text": "BBB",
        },
        {
            "name": "ccc",
            "text": "CCC",
        }
        ]
    },
    {
        date: "2020-01-21",
        size: 7,
        temp: []
    }
];
const newObj = rangeList2rangeBList(range)
console.log(newObj)

запустить можно тут

"use strict"; 
const range2rangeBList = range => Array.from(range.temp, ({ name, text }) => ({ 
    name, text, 
    date: range.date, 
    size: range.size, 
    prop: false, 
})); 
const matrix2arr = (matrix) => matrix.reduce((arr, q, i) => (arr.push(...matrix[i]), arr), []); 
const rangeList2rangeBList = list => matrix2arr(list.map(range2rangeBList)); 
let range = [ 
    { 
        date: "2020-01-20", 
        size: 8, 
        temp: [{ 
                "name": "aaa", 
                "text": "AAA", 
            }, 
            { 
                "name": "bbb", 
                "text": "BBB", 
            }, 
            { 
                "name": "ccc", 
                "text": "CCC", 
            } 
        ] 
    }, 
    { 
        date: "2020-01-21", 
        size: 7, 
        temp: [] 
    } 
]; 
const newObj = rangeList2rangeBList(range); 
console.log(newObj);

READ ALSO
Как создать Map с двумя Map внутри?

Как создать Map с двумя Map внутри?

Вытаскиваю данные с биржи, сначала торговую пару, а потом к ней несколько данных по таймфреймамТо есть

101
Остановить таймер с помощью checknet js

Остановить таймер с помощью checknet js

У меня проблема Я создаю онлайн-тестЯ проверяю, что интернет был отключен с помощью плагина jquery checknet

101
Вывод информации из json используя ajax

Вывод информации из json используя ajax

Используя api стороннего сервиса я отправляю информацию наших заказовНа этом сервисе у заказов 3 статуса: новые, активные и завершенные

98
Как поменять стиль элемента по определённому условию?

Как поменять стиль элемента по определённому условию?

Мне нужно по клику на кнопку перекрасить соседний див в синий цветКомпонент кнопка, и компонент див находятся на одном уровне

85