繁体   English   中英

forEach不是函数,for ... of是不可迭代的

[英]forEach is not a function and for…of is not iterable

在我的TS类中,我有一个方法应该循环访问作为参数接收的对象数组。 由于某种原因,当我尝试使用forEach对其进行迭代时,我突然收到forEach is not a function错误消息。

places.forEach(place => {
  this.addMarker(place.id(), place.coords(), ...);
});

所以我尝试使用for...of迭代器:

for (const place of places) {
  this.addMarker(place.id(), place.coords(), ...);
};

而且我得到的places is not iterable错误的消息。

所以我尝试了旧的for循环:

for (var i = 0; i < places.length; i++) {
  this.addMarker(places[i].id(), places[i].coords(), ...);
};

而且效果很好。

尽管它可以工作,但是在所有这些places[i]看起来都不太好places[i]而且我不确定在所有现代迭代器可用的情况下,在TS文件中使用for循环是否是个好主意。

所以问题是:为什么没有一次又一次的工作? 有可能使它们工作吗? 也许还有其他选择,或者我什至不应该为此而烦恼?

编辑

说明什么places是:

过滤器类别:

export class FilterUtility {
  private placesList = ko.observableArray([]);
  private placesFilter = ko.observable('');
  private storage = new StorageManager();

  setFilter = (category?: any) => {
    if (category == null) {
      this.placesFilter('');
    } else if(category == 'favorites') {
      this.placesFilter(category)
    }
    else {
      this.placesFilter(category.id());
    }
  };

  filteredPlaces = ko.computed(() => {
    let self = this;
    if(!self.placesFilter() || self.placesFilter() == null || self.placesFilter() == '') {
      return this.placesList();
    } else if(self.placesFilter() == 'favorites') {
      return ko.utils.arrayFilter(self.placesList(), function(place: Place){
        return self.storage.isPlaceInFavorites(place.id());
      });
    } else {
      return ko.utils.arrayFilter(this.placesList(), function(place: Place){
        return place.categoryId() == self.placesFilter();
      });
    }
  });

  getFilteredPlaces = () => {
    return this.filteredPlaces;
  };

  addPlace = (place) => {
    this.placesList.push(place);
  }

Main.ts:

$.when(db.getPlacesDataFromMongoLab()).done(placesData => {
    placesData[0].forEach(place => {
        filter.addPlace(new Place(place));
    })
});

this.manageMap = (data) => {
  if (isFirstRun && data == "favorites"){
    isFirstRun = false;
  } else {
    filter.setFilter(data);
    map.renderMarkers(filter.getFilteredPlaces(), self.categoriesList) 
  }
};

manageMap方法被绑定为单击带有Knockout的链接。

地图类:

renderMarkers = function(places, categories) {...}

尝试这种方式:

if ( typeof places !== "undefined" && places!== null) { 
{
    places.forEach(function(place) {
        console.log(place); //<- Or whatever            
    });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM