forEach не является функцией, а for ... of не является итеративным - PullRequest
0 голосов
/ 25 октября 2018

В моем классе 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] это выглядит не очень хорошо, и я не уверен, что будет хорошей идеей использовать цикл for в файле TS со всеми доступными современными итераторами.

Так вот вопрос: почему не для каждого и для ... работы?Можно ли заставить их работать?Возможно, есть другие альтернативы, или я даже не должен беспокоиться об этом?

EDIT

Объяснение того, что 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 голосов
/ 25 октября 2018

Попробуйте так:

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