удалить элемент из сохраненного массива в 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());
    }
}

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

Aghed Aljlad
источник

Ответы:

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он не был найден!
Вин
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);
}
Gulla Prathap Reddy
источник
6

Вы можете использовать это так:

removeDepartment(name: string): void {
    this.departments = this.departments.filter(item => item != name);
  }
Абдус Салам Азад
источник
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)
mbadeveloper
источник
1

Вы можете удалить данные из массива

this.data.splice(index, 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); 
}
Muniaswari D
источник
-2

Это работает для меня

 this.array.pop(index);

 for example index = 3 

 this.array.pop(3);
Вишал Монга
источник
6
pop () удаляет последний элемент, а не тот, который вы выбрали
rostamiani