remova o item da matriz armazenada no angular 2

121

Quero remover um item de um array armazenado no angular 2, com Type Script. Estou usando um serviço chamado Data Service, o DataService Code:

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)];
    }
}

E minha classe de componente:

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());
    }
}

Agora, tudo está funcionando bem, exceto quando tento excluir um item. O log me mostra que o item ainda está na matriz e, portanto, ainda é mostrado na página. Como posso remover o item após selecioná-lo com o botão Excluir ??

Aghed Aljlad
fonte

Respostas:

231

Você não pode usar deletepara remover um item de uma matriz. Isso só é usado para remover uma propriedade de um objeto.

Você deve usar splice para remover um elemento de uma matriz:

deleteMsg(msg:string) {
    const index: number = this.data.indexOf(msg);
    if (index !== -1) {
        this.data.splice(index, 1);
    }        
}
Poul Kruijt
fonte
17
Nota: Se você não marcar o retorno de indexOf()for -1, isso removerá o último item do array quando msgnão foi encontrado!
Martin Schneider
130

Acho que a maneira do Angular 2 de fazer isso é o método de filtro:

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

onde data_item é o item que deve ser excluído

KaFu
fonte
2
no modelo, você deve usar um Pipe para filtrar sua matriz
KaFu
1
removeArrayItem (objectitem) {this.totalArrayData = this.totalArrayData.filter (item => item.Id! == objectitem.id); console.log (this.totalArrayData)}. Está funcionando. Thanx
gnganpath
isso funcionou para mim, pois por algum motivo splice()estava removendo tudo, exceto o valor que eu queria remover da matriz
Yvonne Aburrow
@KaFu - Você pode mostrar a parte do modelo, como você está usando o tubo
sneha mahalank
A função anônima deve ter um retorno para funcionar: this.data = this.data.filter (item => return item! == data_item);
Igor Zelaya
35

Não use deletepara remover um item da matriz e use em seu splice()lugar.

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

Veja uma pergunta semelhante: Como faço para remover um elemento específico de uma matriz em JavaScript?

Observe que o TypeScript é um superconjunto do ES6 (os arrays são iguais tanto no TypeScript quanto no JavaScript), portanto, sinta-se à vontade para procurar soluções JavaScript mesmo quando estiver trabalhando com TypeScript.

Martin
fonte
3
Nota: Se você não marcar o retorno de indexOf()for -1, isso removerá o último item do array quando msgnão foi encontrado!
Vin
9

Isso pode ser alcançado da seguinte forma:

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

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

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

e

deleteEmployee(i)
{
  this.$emps.splice(i,1);
}
gulla prathap reddy
fonte
5

Você pode usar assim:

removeDepartment(name: string): void {
    this.departments = this.departments.filter(item => item != name);
  }
Abdus Salam Azad
fonte
4

Às vezes, a emenda não é suficiente, especialmente se o seu array estiver envolvido em uma lógica FILTER. Portanto, em primeiro lugar, você pode verificar se o seu elemento existe para ter certeza absoluta de remover esse elemento exato:

if (array.find(x => x == element)) {
   array.splice(array.findIndex(x => x == element), 1);
}
Alessandro Ornano
fonte
Isso não é um pouco ineficiente, já que você está fazendo 2 descobertas, quando pode apenas fazer 1?
rhavelka
@rhavelka Depende da versão angular da emenda: se a sua emenda falhar em vez de ficar nula, este código deve ser seguro para evitar a emenda inútil.
Alessandro Ornano
Certo, não estou dizendo que sua lógica é falha, apenas que pode ser facilmente otimizada. Você está fazendo a find, então a findIndex, são duas pesquisas em que você poderia fazer uma (como a resposta aceita).
rhavelka
1

Use splice()para remover o item do array e atualizar o índice do array para ser consequência.

delete irá remover o item da matriz, mas não atualizará o índice da matriz o que significa que se você deseja remover o terceiro item de quatro itens da matriz o índice dos elementos ficará depois de excluir o elemento 0,1,4

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

Você pode excluir os dados da matriz

this.data.splice(index, 1);
Jatin Devani
fonte
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
fonte
-2

Isso funciona para mim

 this.array.pop(index);

 for example index = 3 

 this.array.pop(3);
Vishal Monga
fonte
6
pop () remove o último elemento, não o elemento que você selecionou
rostamiani