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?

aghed aljlad
źródło

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);
    }        
}
Poul Kruijt
źródło
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

KaFu
źródło
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.

jaskółka oknówka
źródło
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);

HamidKhan
źródło
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);
}
gulla prathap reddy
źródło
5

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

removeDepartment(name: string): void {
    this.departments = this.departments.filter(item => item != name);
  }
Abdus Salam Azad
źródło
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);
}
Alessandro Ornano
źródło
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)
mbadeveloper
źródło
1

Możesz usunąć dane z tablicy

this.data.splice(index, 1);
Jatin Devani
źródło
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); 
}
Muniaswari D
źródło
-2

To działa dla mnie

 this.array.pop(index);

 for example index = 3 

 this.array.pop(3);
Vishal Monga
źródło
6
pop () usuwa ostatni element, a nie element, który wybrałeś
rostamiani