удалить элемент из сохраненного массива в angular 2


122

Я хочу удалить элемент из сохраненного массива в angular 2 с помощью Type Script. Я использую службу под названием 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());
    }
}

Теперь все работает нормально, кроме случаев, когда я пытаюсь удалить элемент. Журнал показывает мне, что элемент все еще находится в массиве и, следовательно, все еще отображается на странице. Как удалить элемент после выбора его кнопкой удаления ??

Ответы:


231

Вы не можете использовать 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он не был найден!
Мартин Шнайдер

131

Я думаю, что способ Angular 2 сделать это - метод фильтрации:

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

где data_item - это элемент, который следует удалить


2
в шаблоне вы должны использовать Pipe для фильтрации вашего массива
KaFu

1
removeArrayItem (objectitem) {this.totalArrayData = this.totalArrayData.filter (item => item.Id! == objectitem.id); console.log (this.totalArrayData)}. Это работает. Thanx
gnganpath

это сработало для меня, так как по какой-то причине splice()удалялось все, кроме значения, которое я хотел удалить из массива
Ивонн Абурроу

@KaFu - Не могли бы вы показать часть шаблона, как вы используете pipe
sneha mahalank

Для работы анонимной функции должен быть возврат: this.data = this.data.filter (item => return item! == data_item);
Игорь Селая

35

Не используйте deleteдля удаления элемента из массива, а используйте splice()вместо этого.

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

См. Аналогичный вопрос: как удалить определенный элемент из массива в JavaScript?

Обратите внимание, что TypeScript - это надмножество ES6 (массивы одинаковы как в TypeScript, так и в JavaScript), поэтому не стесняйтесь искать решения JavaScript даже при работе с TypeScript.


3
Примечание. Если вы не отметите возврат indexOf()for -1, это приведет к удалению последнего элемента из массива, если msgон не был найден!
Вин


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

Иногда сращивания недостаточно, особенно если ваш массив задействован в логике ФИЛЬТРА. Итак, прежде всего вы можете проверить, существует ли ваш элемент, чтобы быть абсолютно уверенным в удалении именно этого элемента:

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

Разве это не немного неэффективно, поскольку вы делаете 2 находки, когда можете просто сделать 1?
rhavelka

@rhavelka Зависит от угловой версии склейки: если склейка выйдет из строя вместо получения нуля, этот код должен быть безопасным, чтобы избежать бесполезной склейки ..
Алессандро Орнано,

Верно, я не говорю, что ваша логика ошибочна, просто ее можно легко оптимизировать. Вы выполняете а 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.