Дублирующаяся запись создается в массиве объектов при отправке одних и тех же данных в два разных массива

У меня странная проблема из-за allIpRecords: any;, в которой я хочу сохранить копию ipRecords: any;, потому что в исходном коде ipRecords может измениться, и я хочу сохранить предыдущую копию в allIpRecords Проблема заключается в том, что всякий раз, когда запускается функция вставки, и если у меня есть this.allIpRecords = res.data; внутри функции вставки, то в обоих массивах ipRecords и this.allIpRecords создаются дубликаты записей вставленной строки, и в таблице одна и та же строка отображается два раза. Если я удалю this.allIpRecords, то ничего подобного не произойдет, в массиве будет только одна запись вставленных элементов. Несмотря на то, что в базу данных он вставляется только один раз, в локальном массиве он отображается два раза.

   <td>
              <span></span>
          </td>
          <td>
              <input type = "text" [(ngModel)] = "newData.ip" />
          </td>
          <td>
              <input type = "text"  [(ngModel)] = "newData.forDomain" />
          </td>
          <td>
              <input type = "text" [(ngModel)] = "newData.status" />
          </td>
          <td>
              <input type = "text" [(ngModel)] = "newData.senderEmail" />
          </td>
          <td>
              <button class = "common-btn" type = "button" (click) = "insert()">Insert</button>
          </td>


           </tr>
      <tr *ngFor = "let record of ipRecords" class = "colour02">
      <td>{{record.id}}</td>
      <td *ngIf = "record.id === editRowId"><input type = "text" [(ngModel)] = "record.ip" ></td>
      <td *ngIf = "record.id !== editRowId">{{record.ip}}</td>
      <td *ngIf = "record.id === editRowId"><input type = "text" [(ngModel)] = "record.forDomain" ></td>
      <td *ngIf = "record.id !== editRowId">{{record.forDomain}}</td>
      <td *ngIf = "record.id === editRowId"><input type = "text" [(ngModel)] = "record.status" ></td>
      <td *ngIf = "record.id !== editRowId">{{record.status}}</td>
      <td *ngIf = "record.id === editRowId"><input type = "text" [(ngModel)] = "record.senderEmail" ></td>
      <td *ngIf = "record.id !== editRowId">{{record.senderEmail}}</td>
      <td>
      <br>

Ц

       private newData: any = {};
       ipRecords: any;
       allIpRecords: any;

        ngOnInit() {
        this.auth.getAllIpRecords().subscribe((res: any)=>{
       this.ipRecords = res.data;
       this.allIpRecords = res.data;
       }
        }


        insert() {
if (Object.keys(this.newData).length === 0) {
  this.toastr.error("Empty record");
  return;
}
this.auth.addIpRecord(this.newData).subscribe((res: any)=>{
  if (res.status === "Success") {
    this.newData = {};
    this.ipRecords.push(res.data);
    this.allIpRecords.push(res.data);
    }
  }
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
0
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В обеих переменных вы передаете одну и ту же ссылку на объект -

this.ipRecords = res.data;
this.allIpRecords = res.data;

Таким образом, модификация любой одной переменной изменит их все, потому что они являются одной и той же ссылкой.

Чтобы решить эту проблему, клонируйте рез.данные, а затем назначьте его переменным. Это легко сделать, используя JSON.stringify() и JSON.parse().

this.ipRecords = JSON.parse(JSON.stringify(res.data));
this.allIpRecords = JSON.parse(JSON.stringify(res.data));

Вы можете найти более подробную информацию о клонировании объектов ЗДЕСЬ

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

venabeo 29.05.2019 17:03

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

Arshad 29.05.2019 20:12

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

Arshad 29.05.2019 20:16

Другие вопросы по теме