从角度2中的存储数组中删除项目


119

我想使用Type Script从角度2的存储数组中删除一个项目。我正在使用一种称为数据服务的服务,数据服务代码:

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

现在,一切正常,除了我尝试删除项目时。日志显示该项目仍在数组中,因此仍显示在页面上。使用删除按钮将其选中后如何删除?

Answers:


229

您不能用于delete从数组中删除项目。这仅用于从对象中删除属性。

您应该使用splice从数组中删除元素:

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方法是filter方法:

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

这对我splice()
有用

@KaFu-您能否显示模板部分,您如何使用管道
sneha mahalank,

35

不要使用delete从数组中删除项目,splice()而是使用。

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

看到一个类似的问题:如何从JavaScript中的数组中删除特定元素?

请注意,TypeScript是ES6的超集(TypeScript和JavaScript中的数组相同),因此即使在使用TypeScript时也可以随时查找JavaScript解决方案。


3
注意:如果不检查indexOf()for 的返回值-1,这将msg在未找到时从数组中删除最后一项!
Vin

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


4

有时,拼接是不够的,特别是如果您的数组涉及FILTER逻辑时。因此,首先您可以检查您的元素是否确实存在,以确保删除该确切元素:

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

这是不是效率不高,因为当您只能执行1次操作时会执行2次查找?
rhavelka

如果您的拼接崩溃,而不是越来越空,这段代码应该是安全的,以避免无用的拼接..:通过拼接角版本@rhavelka依靠
亚历山德罗Ornano

是的,我并不是说您的逻辑有缺陷,只是可以很容易地对其进行优化。您正在执行find,然后执行,则findIndex可以进行一次搜索(例如已接受的答案),即进行两次搜索。
rhavelka

1

用于splice()从数组中删除项目,其结果是刷新数组索引。

delete 将从数组中删除项目,但不会刷新数组索引,这意味着如果要从四个数组项目中删除第三个项目,则元素索引将在删除元素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
pop()删除最后一个元素,而不是您选择的元素
rostamiani
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.