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

时间:2018-10-25 18:17:26

标签: javascript typescript for-loop foreach for-of-loop

在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]看起来都不太好,我不确定在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) {...}

1 个答案:

答案 0 :(得分:-1)

尝试一下:

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