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.