각도 2의 저장된 배열에서 항목 제거


119

Type Script를 사용하여 각도 2의 저장된 배열에서 항목을 제거하고 싶습니다. 저는 Data Service 라는 서비스 인 DataService 코드를 사용하고 있습니다.

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

그리고 내 구성 요소 클래스 :

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

이제 항목을 삭제하려고 할 때를 제외하고는 모든 것이 잘 작동합니다. 로그는 항목이 여전히 배열에 있으므로 페이지에 계속 표시됨을 보여줍니다. 삭제 버튼으로 항목을 선택한 후 제거하려면 어떻게해야합니까 ??

답변:


229

delete배열에서 항목을 제거하는 데 사용할 수 없습니다 . 이것은 객체에서 속성을 제거하는 데만 사용됩니다.

스플 라이스 를 사용 하여 배열에서 요소를 제거 해야합니다 .

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

17
참고 :indexOf() for 의 반환을 확인 하지 않으면 찾을 수 없을 -1때 배열에서 마지막 항목이 제거 msg됩니다!
Martin Schneider

130

Angular 2 방법은 필터 방법이라고 생각합니다.

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

여기서 data_item은 삭제해야하는 항목입니다.


2
템플릿에서 파이프를 사용하여 어레이를 필터링해야합니다
KaFu

1
removeArrayItem (objectitem) {this.totalArrayData = this.totalArrayData.filter (item => item.Id! == objectitem.id); console.log (this.totalArrayData)}. 작동 중입니다. 고맙습니다
gnganpath

이것은 몇 가지 이유로, 나를 위해 일한 splice()모든 것을 제거 된 것을 제외하고 값 i가 배열에서 제거하고 싶어
이본 Aburrow을

@KaFu-템플릿 부분을 보여 주
시겠습니까?

35

사용하지 마십시오 delete배열에서 항목을 제거하고 사용하는 splice()대신.

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

유사한 질문을 참조하십시오. JavaScript의 배열에서 특정 요소를 어떻게 제거합니까?

TypeScript는 ES6의 상위 집합 (배열은 TypeScript와 JavaScript 모두에서 동일 함)이므로 TypeScript로 작업 할 때도 JavaScript 솔루션을 자유롭게 찾아보십시오.


3
참고 :indexOf() for 의 반환을 확인 하지 않으면 찾을 수 없을 -1때 배열에서 마지막 항목이 제거 msg됩니다!

9

이는 다음과 같이 달성 할 수 있습니다.

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>

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

5

다음과 같이 사용할 수 있습니다.

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

4

특히 어레이가 FILTER 로직에 관련된 경우 스플 라이스가 충분하지 않은 경우가 있습니다. 따라서 먼저 해당 요소가 존재하는지 확인하여 정확한 요소를 제거 할 수 있습니다.

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

1 개만 할 수 있는데도 2 개의 찾기를하므로 조금 비효율적이지 않나요?
rhavelka

@rhavelka 스플 라이스 각도 버전에 따라 다릅니다. 스플 라이스가 null이되는 대신 충돌이 발생하면이 코드는 유용하지 않은 스플 라이스를 방지하기 위해 안전해야합니다.
Alessandro Ornano

맞습니다, 당신의 논리에 결함이 있다고 말하는 것이 아니라 쉽게 최적화 할 수 있다는 것입니다. 당신은 일을하고 find, 그 다음은 findIndex당신이 (허용 대답처럼) 일을 할 수있을 때, 그 두 검색입니다.
rhavelka

1

splice()배열에서 항목을 제거하는 데 사용 하여 배열 인덱스를 새로 고칩니다.

delete 배열에서 항목을 제거하지만 배열 인덱스를 새로 고치지 않습니다. 즉, 4 개의 배열 항목에서 세 번째 항목을 제거하려는 경우 요소의 인덱스는 요소 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

그게 나를 위해 일해

 this.array.pop(index);

 for example index = 3 

 this.array.pop(3);

6
당신이 선택하는 마지막 요소가 아니라 요소 제거) (팝업
rostamiani
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.