Clone массив объектов удаляет тип класса - PullRequest
0 голосов
/ 07 июня 2019

Я должен глубоко клонировать массив объектов

  filterList: Filter[] = [
    new ChipsFilter('Rating', 'rating',
      [
        {
          name: '5 ★',
          key: '5',
          value: true
        },
        {
          name: '4 ★',
          key: '4',
          value: true
        },
        {
          name: '3 ★',
          key: '3',
          value: true
        },
        {
          name: '2 ★',
          key: '2',
          value: true
        },
        {
          name: '1 ★',
          key: '1',
          value: true
        }
      ]),
    new CheckboxFilter('Country', 'country', [
      {
        name: 'India',
        key: 'india',
        value: true
      },
      {
        name: 'Brazil',
        key: 'brazil',
        value: false
      },
      {
        name: 'UAE',
        key: 'uae',
        value: true
      },
      {
        name: 'Sri Lanka',
        key: 'sri-lanka',
        value: true
      },
      {
        name: 'USA',
        key: 'usa',
        value: false
      },
      {
        name: 'England',
        key: 'england',
        value: true
      },
      {
        name: 'South Africa',
        key: 'south-africa',
        value: true
      }
    ]),
    new CalendarFilter('Date', 'createdAt', [
      {
        name: 'Start Date',
        key: 'startDate',
        value: ''
      },
      {
        name: 'End Date',
        key: 'endDate',
        value: ''
      }
    ]),
  ];

После клонирования я хочу, чтобы тип данных объектов был таким же, но вместо этого я получаю объект в качестве типа, попробовал приведенные ниже методы клонирования.

  1. Использование JSON stringify
this.filterList = this.filterList.map(a => Object.assign({}, a));
  1. Использование object.assign
this.filterList = this.filterList.map(a => Object.assign({}, a));

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Это будет учитывать переменные типы объектов:

class ChipsFilter {constructor(){this.chipsProp="chipsProp"}}
class CheckboxFilter {constructor(){this.checkboxProp= "checkboxProp"}}
class CalendarFilter {constructor(){this.calendarProp= "calendarProp"}}

const filterList = [
  new ChipsFilter(),
  new CheckboxFilter(),
  new CalendarFilter(),
];

let out = filterList.map(obj=>Object.assign(new obj.constructor, obj));
console.log(out[0].constructor, out[0]);
console.log(out[1].constructor, out[1]);
console.log(out[2].constructor, out[2]);
0 голосов
/ 07 июня 2019

Первый аргумент Object.assign() - целевой объект.Этот объект эффективно является результатом.Object.assign() просто скопирует собственные перечисляемые свойства ваших CalendarFilter экземпляров в эту цель.

Вместо этого вы можете создать новые экземпляры ваших объектов в array.map() вместо назначения ихуниверсальный объект с Object.assign().

this.filterList = this.filterList.map(a => new CalendarFilter(...))

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

...