角度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して配列から項目を削除することはできません。これは、オブジェクトからプロパティを削除するためにのみ使用されます。

配列から要素を削除するには、spliceを使用する必要があります。

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

17
注:indexOf() for の戻り値を確認しないと-1msg見つからなかったときに配列から最後の項目が削除されます。
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)}。それは働いています。Thanx
gnganpath 2017

これは私にとってsplice()はうまくいきました。何らかの理由で、アレイから削除したい値を除いてすべて削除していたからです
Yvonne Aburrow

@KaFu-テンプレート部分を見せていただけますか、パイプの使用方法
sneha mahalank

35

delete配列から項目を削除するために使用せず、splice()代わりに使用します。

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

同様の質問を参照してください:JavaScriptで配列から特定の要素を削除するにはどうすればよいですか?

TypeScriptはES6のスーパーセットであることに注意してください(配列はTypeScriptとJavaScriptの両方で同じです)。TypeScriptを使用している場合でも、JavaScriptソリューションを探してください。


3
注:indexOf() for の戻り値を確認しないと-1msg見つからなかったときに配列から最後の項目が削除されます。
Vin




4

配列がFILTERロジックに関係している場合は特に、スプライスだけでは不十分な場合があります。したがって、まず最初に、要素が存在するかどうかを確認して、その要素を確実に削除します。

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

1つしか実行できないときに2つの検索を実行しているので、これは少し非効率ではありませんか?
rhavelka

あなたのスプライスクラッシュ場合は代わりのヌルを取得し、このコードは..役に立たないスプライスを避けるために、安全にする必要があります:スプライス角度バージョンによってディペン@rhavelka
アレッサンドロオルナーノ

そうです、あなたのロジックに欠陥があると言っているのではなく、簡単に最適化できるということだけです。あなたはを実行しfind、次にを実行していますfindIndex
rhavelka

1

splice()配列から項目を削除するために使用し、結果として配列インデックスを更新します。

delete 配列から項目を削除しますが、配列インデックスを更新しません。つまり、4つの配列項目から3番目の項目を削除する場合、要素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); 
}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.