usuń element z przechowywanej tablicy w kątowej 2


121

Chcę usunąć element z przechowywanej tablicy w kątowej 2 za pomocą skryptu typu. Korzystam z usługi o nazwie Usługa danych, kod usługi danych :

export class DataService {

    private data: string[] = [];

    addData(msg: string) {
        this.data.push(msg);
    }

    getData() {
        return this.data;
    }

    deleteMsg(msg: string) {
        delete [this.data.indexOf(msg)];
    }
}

I moja klasa komponentów:

import {Component} from '@angular/core'
import {LogService} from './log.service'
import {DataService} from './data.service'

@Component({
    selector: 'tests',
    template:
            `
        <div class="container">
            <h2>Testing Component</h2>
            <div class="row">
                <input type="text" placeholder="log meassage" #logo>
                <button class="btn btn-md btn-primary" (click)="logM(logo.value)">log</button>
                <button class="btn btn-md btn-success" (click)="store(logo.value)">store</button>
                <button class="btn btn-md btn-danger" (click)="send()">send</button>
                <button class="btn btn-md " (click)="show()">Show Storage</button>
                <button (click)="logarray()">log array</button>
            </div>
            <div class="col-xs-12">
                <ul class="list-group">
                    <li *ngFor="let item of items" class="list-group-item" #ival>
                        {{item}}
                        <button class="pull-right btn btn-sm btn-warning" (click)="deleteItem(ival.value)">Delete
                        </button>
                    </li>
                </ul>
            </div>
            <h3>{{value}}</h3>
            <br>
        </div>
    `
})

export class TestsComponent {

    items: string[] = [];

    constructor(
        private logService: LogService,
        private dataService: DataService) {

    }

    logM(message: string) {
        this.logService.WriteToLog(message);
    }

    store(message: string) {
        this.dataService.addData(message);
    }

    send(message: string) {
    }

    show() {
        this.items = this.dataService.getData();
    }

    deleteItem(message: string) {
        this.dataService.deleteMsg(message);
    }

    logarray() {
        this.logService.WriteToLog(this.items.toString());
    }
}

Teraz wszystko działa dobrze, z wyjątkiem sytuacji, gdy próbuję usunąć element. Dziennik pokazuje, że element nadal znajduje się w tablicy i dlatego jest nadal wyświetlany na stronie. Jak mogę usunąć element po wybraniu go przyciskiem usuwania?

Odpowiedzi:


231

Nie możesz użyć deletedo usunięcia elementu z tablicy. Służy to tylko do usuwania właściwości z obiektu.

Do usunięcia elementu z tablicy należy użyć splice :

deleteMsg(msg:string) {
    const index: number = this.data.indexOf(msg);
    if (index !== -1) {
        this.data.splice(index, 1);
    }        
}

17
Uwaga: jeśli nie zaznaczysz zwrotu indexOf()dla -1, spowoduje to usunięcie ostatniego elementu z tablicy, jeśli msgnie został znaleziony!
— Martin Schneider

130

Myślę, że sposobem Angulara 2 jest to metoda filtrowania:

this.data = this.data.filter(item => item !== data_item);

gdzie data_item to element, który powinien zostać usunięty


2
w szablonie do filtrowania tablicy należy użyć
— potoku

1
removeArrayItem (objectitem) {this.totalArrayData = this.totalArrayData.filter (item => item.Id! == objectitem.id); console.log (this.totalArrayData)}. To działa. Dzięki
— gnganpath

to zadziałało dla mnie, ponieważ z jakiegoś powodu splice()
— usunęło

@KaFu - Czy możesz pokazać część szablonu, jak używasz rury
— sneha mahalank

Aby funkcja anonimowa działała, powinna mieć zwrot: this.data = this.data.filter (item => return item! == data_item);
— Igor Zelaya

35

Nie używaj deletedo usuwania elementu z tablicy i używaj splice()zamiast tego.

this.data.splice(this.data.indexOf(msg), 1);

Zobacz podobne pytanie: Jak usunąć określony element z tablicy w JavaScript?

Zwróć uwagę, że TypeScript jest nadzbiorem ES6 (tablice są takie same zarówno w języku TypeScript, jak i JavaScript), więc nie krępuj się szukać rozwiązań JavaScript, nawet podczas pracy z TypeScript.


3
Uwaga: jeśli nie zaznaczysz zwrotu indexOf()dla -1, spowoduje to usunięcie ostatniego elementu z tablicy, jeśli msgnie został znaleziony!
— Vin

9

Można to osiągnąć w następujący sposób:

this.itemArr = this.itemArr.filter( h => h.id !== ID);


8
<tbody *ngFor="let emp of $emps;let i=index">

<button (click)="deleteEmployee(i)">Delete</button></td>

i

deleteEmployee(i)
{
  this.$emps.splice(i,1);
}

5

Możesz użyć w ten sposób:

removeDepartment(name: string): void {
    this.departments = this.departments.filter(item => item != name);
  }

4

Czasami splice nie wystarcza, zwłaszcza jeśli twoja tablica jest zaangażowana w logikę FILTER. Więc przede wszystkim możesz sprawdzić, czy twój element istnieje, aby mieć absolutną pewność, że usuniesz dokładnie ten element:

if (array.find(x => x == element)) {
   array.splice(array.findIndex(x => x == element), 1);
}

Czy nie jest to trochę nieefektywne, ponieważ wykonujesz 2 znalezienia, podczas gdy możesz zrobić tylko 1?
— rhavelka

@rhavelka W zależności od wersji kątowej splotu: jeśli twój splot ulegnie awarii zamiast uzyskać zerową wartość, ten kod powinien być bezpieczny, aby uniknąć bezużytecznego połączenia ..
— Alessandro Ornano

Racja, nie twierdzę, że twoja logika jest błędna, tylko że można ją łatwo zoptymalizować. Robisz find, a potem a findIndex, to dwa wyszukiwania, kiedy możesz zrobić jedno (jak zaakceptowana odpowiedź).
— rhavelka

1

Użyj, splice()aby usunąć element z tablicy, aby odświeżyć indeks tablicy.

delete usunie element z tablicy, ale nie odświeży indeksu tablicy co oznacza, że ​​jeśli chcesz usunąć trzecią pozycję z czterech elementów tablicy, indeks elementów będzie po usunięciu elementu 0,1,4

this.data.splice(this.data.indexOf(msg), 1)


0
//declaration 
list: Array<any> = new Array<any>(); 

//remove item from an array 
removeitem() 
{
const index = this.list.findIndex(user => user._id === 2); 
this.list.splice(index, 1); 
}

-2

To działa dla mnie

 this.array.pop(index);

 for example index = 3 

 this.array.pop(3);

6
pop () usuwa ostatni element, a nie element, który wybrałeś
— rostamiani
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.