Nano Hash - криптовалюты, майнинг, программирование

Как скопировать массив с вложенным элементом в Angular/Typescript?

Как я могу клонировать объект класса массива в Angular?

ParentModel {
  id: number;

  child1Id: number;
  child2Id: number;

  child1 : ChildModel;
  child2 : ChildModel;
}

ChildModel{
  id: number;
}

parents: ParentModel [] = [];

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

Редактировать: после поиска нет способа сделать это, мы не можем делать самые простые вещи с typescript/Angular :)
Я создал новый объект и присвоил каждое значение вручную для копирования. а также назначать атрибуты дочернего компонента вручную.

Edit2: const clone = JSON.parse(JSON.stringify(parents)) первый ответ в этом вопросе тоже работает нормально, но я не уверен, что он имеет хорошую производительность и правильное решение.


  • можете ли вы предоставить больше кода (в случае, если решение, предоставленное cgTag, не сработало) 21.05.2019
  • вы можете использовать оператор распространения (т.е. ... (3 точки)) для клонирования, например const parent_clone = [...parents]; 21.05.2019
  • @SunnyGoel, к сожалению, не копирует дочерние элементы. 22.05.2019
  • @cgTag, который является самым быстрым и лучшим способом глубокого клонирования чего-либо в javascript, если у вас нет циклической ссылки внутри одного из объектов в этом массиве. 22.05.2019

Ответы:


1

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

// структура

ParentModel {
  id: number;
  child1Id: number;
  child2Id: number;
  child1 : ChildModel;
  child2 : ChildModel;
}
ChildModel{
  id: number;
}

компонент.ts

export class ActionComponent implements OnInit
parents: ParentModel [] = [];
parentClone:: ParentModel [] = [];
}    
constructor(){}    
ngOnInit() {
 this.parentClone= this.parents.slice();
}
}

this.parents.slice(); это создаст новый массив и назначит this.parentClone со всеми родительскими данными

22.05.2019
  • Array.slice() создает мелкую копию исходного массива. Ссылки на объекты (а не клоны) копируются в новый массив (см. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/). 27.05.2019

  • 2

    После долгих поисков

    obj = JSON.parse(JSON.stringify(o))

    это единственный метод, но более эффективный

    либо напишите свой собственный клон, либо используйте глубокую копию из внешней библиотеки https://hassantariqblog.wordpress.com/2016/10/15/angular2-import-lodash-into-angular2-application-using-typescript/

    22.05.2019

    3

    Используйте оператор распространения как для родителя, так и для дочерних элементов:

    const toClone = (p: ParentModel) => ({
     ... p,
     child1: {... p.child1},
     child2: {... p.child2},
    });
    
    const clonedParents: ParentsModel[] = parents.map(toClone);
    

    (Предполагая, что можно иметь поверхностный клон child1 и child2)

    22.05.2019

    4

    вы можете добиться этого с помощью deep-copy такого массива

    ParentModel {
      id: number;
    
      child1Id: number;
      child2Id: number;
    
      child1 : ChildModel;
      child2 : ChildModel;
    }
    
    ChildModel{
      id: number;
    }
    
    parents: ParentModel [] = [];
    child: ChildModel [] = [];
    ngOnInit() {
       this.parents.child1 = {...this.child};
       this.parents.child2 = {...this.child};
    }
    
    
    
    21.05.2019
  • Моя цель - копирование родителей с детьми. Это не выглядит правильным решением 22.05.2019
  • parents - это массив ParentModel, а не один экземпляр 23.05.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..