Angular .filter()不处理JSON响应

时间:2017-10-02 18:58:03

标签: json angular

据我所知,当返回值中只有一个单个对象时,.filter()方法对.json()返回的响应不起作用。我不知道如何处理这个问题。

getFavorites() {
const userId = this.authService.getActiveUser().uid;
return this.http.get(this.databaseAddress + userId + '.json')
  .map(
    (response: Response) => {
    return response.json();
    })
  .do(
    (data) => {
      if(data) {
        this.favorites = data;
      }else {
        this.favorites = [];
      }
    })

}

this.favoritesService.getFavorites()
    .subscribe(
      (list: Recipe[]) => {
        if(list) {
          this.favoriteRecipes = list.filter(
            item => item !== null
          );
        } else {
          this.favoriteRecipes = [];
        }
      }
    );

返回错误:

ERROR TypeError: list.filter is not a function

2 个答案:

答案 0 :(得分:0)

如果API未返回任何数据,您的回复将为null / emptyfilter操作仅适用于Array类型。考虑从[]运算符返回map空数组。

getFavorites() {
const userId = this.authService.getActiveUser().uid;
return this.http.get(this.databaseAddress + userId + '.json')
  .map(
    (response: Response) => {
        return response.json() || []; // return blank [] if data is null or empty
    })
  .do(
    (data) => {
      if(data) {
        this.favorites = data;
      }else {
        this.favorites = [];
      }
    })
}

答案 1 :(得分:0)

正如您所提到的,问题不在于响应为空/空时,问题是响应中只有1个对象。

只需将您拥有的任何结果附加到空数组中,就完成了......

getFavorites() {
const userId = this.authService.getActiveUser().uid;
return this.http.get(this.databaseAddress + userId + '.json')
  .map(
    (response: Response) => {
    return response.json();
    })
  .do(
    (data) => {
      if(data) {
        this.favorites = [].push(data);
      }else {
        this.favorites = [];
      }
    })