无法从打字稿中的对象列表中删除项目

Unable to remove item from list of objects in typescript

我正在使用以下代码从 firebase 检索对象列表。我需要从列表中删除一个项目,但我一直为索引获取 -1。我在这里做错了什么?

filterItineraries(filters: any): any {
  let num = 0;
  this.allItineraries = [];
  this.filteredItineraries = [];

  for (let i = 0; i < 2; i++) {
    if (i === 0) {
      num = 0;
    } else {
      num = (filters.numberOfDays - 1);
    }

    const query = this.dataSvc.getAllItineraries()
        .where('destination', '==', filters.destination)
        .where('dateRange', 'array-contains', filters.dateRange[num]);

    query.get()
        .then(itineraryListSnapshot => {
          this.allItineraries = [];

          itineraryListSnapshot.forEach(snap => {
            this.allItineraries.push({
              id: snap.id,
              jobCode: snap.data().jobCode,
              destination: snap.data().destination,
              startDate: snap.data().startDate,
              endDate: snap.data().endDate,
              workDetails: snap.data().workDetails,
              userId: snap.data().userId
            });

            const index: number = this.allItineraries.indexOf(filters.id);

            if (index !== -1) {
              this.allItineraries.splice(index, 1);
            }

            console.log('index', index);
            console.log('filters.id', filters.id);
            console.log('filteredItineraries',  this.allItineraries);
          });
        });
  }
}

console.log

我也试过将它移出 for 循环,但索引 = -1。

最后我试过了:

this.filteredItineraries = this.allItineraries;
const index: number = this.filteredItineraries.indexOf(filters.id);

if (index !== -1) {
  this.filteredItineraries.splice(index, 1);
}

console.log('index', index);
console.log('filters.id', filters.id);
console.log('filteredItineraries',  this.filteredItineraries);

索引总是=-1

此行未按您的要求执行:

const index: number = this.allItineraries.indexOf(filters.id);

index 在这里总是 -1,因为 allItineraries 是一个对象数组,而 filters.id 是(从控制台输出的外观来看)一个字符串.

您需要自己遍历 allItineraries 才能找到条目 e,其中 e.id === filters.id(您现有的比较是 e === filters.id)。


与其自己迭代,不如使用 filter and map 方法?

this.allItineraries = itineraryListSnapshot
        .filter(snap => snap.id !== filters.id)
        .map(snap => { id: snap.id, ...snap.data() });

我也用过object spread syntax which is supported in TypeScript >= 2.1.