试图理解这段代码: map((data: SearchResponse) => data && data.items || [])

时间:2021-05-27 15:30:47

标签: angular typescript angular11

我是 Angular 的新手,正在尝试通过检查代码示例来学习。我为 ngx-Typeahead 提取了一些示例代码,并试图理解代码。

interface SearchResponse {
  total_count: number;
  incomplete_results: boolean;
  items: Owner[];
}

然后

this.suggestions$ = new Observable((observer: Observer<string>) => {
      observer.next(this.search);
    }).pipe(
      switchMap((query: string) => {
        if (query) {
          return this.http.get<SearchResponse>('https://localhost:5001/api/GetOwners', {
            params: { q: query }
          }).pipe(
            map((data: SearchResponse) => data && data.items || []),
            tap(() => noop, err => { this.errorMessage = err && err.message || 'Something goes wrong'; })
          );
        }

        return of([]);
      })
    );

这行代码表示:

map((data: SearchResponse) => data && data.items || [])

读取类似“将响应映射到此函数并将其称为“数据”之类的内容。然后使用它,然后将它与项目(SearchResponse 的一个元素)一起使用。如果那个 AND 什么都没有,则返回一个空数组。那么如果不是什么都没有呢? “data && data.items 会产生什么?还是我想多了,data && data.items 将返回 true 以便返回整个数据项?

4 个答案:

答案 0 :(得分:1)

像这样使用 &&||if/else 检查值或获取默认值的简写。

data && data.items || []if (data && data.items) data.items else [](或 (data && data.items) ? data.items : [])相同。也就是说,如果定义了 data 并且 data.items 不是假的(例如一个非空数组),你会得到 data.items。否则,你会得到一个空数组。

这是可行的,因为在 Typescript 中,&&|| 运算符总是返回它们的参数之一:

  • a && ba,如果 a 为假,或 b
  • a || ba 如果 a 是真的,或者 b

而且由于它们短路(仅在需要时评估操作数),您可以使用它们在访问值之前检查它。

这意味着如果 data.items 存在且非空,则 data && data.items 将是该值。否则,它将是一个假值,(that value) || [] 将成为空数组---默认值。

答案 1 :(得分:1)

这是确保您使用正确定义的值(在本例中为数组)的简写。当使用一个对象作为这样的条件时,如果对象存在,它的行为就好像它是 True ,如果它不存在,它的行为就好像它是 False (即 null、undefined、0 等)。如果 data 是一个非空的、已定义的东西,那么语言会处理 AND 的另一端。如果 data.items 是一个非空的、已定义的事物,则表达式短路。 true && true || ??? 不需要处理第三个元素来知道表达式的计算结果为真。但是表达式不返回 true,它返回最后计算的条件,所以如果 datadata.items 都是非空的,定义的东西,它会返回 {{1} }.

如果 data.item 是一个东西而 data 不是一个东西怎么办?然后我们有 data.item 可以缩短为 true && false || ???。短路还没有开始,所以我们必须评估第三个条件:空数组。空数组是一个非空的、已定义的东西,所以它的作用是真实的。它也是最后一个计算的表达式,因此返回空数组。

如果 false || ???data 都不持有值,则返回空数组。

我认为 data.items 不可能为空或未定义并且 data 不会抛出错误。

实际上,所有这些都相当于说“我想要 data.items 但如果它没有定义,给我一个空数组。”这是利用JS引擎的花哨类型强制。

答案 2 :(得分:0)

正确 - 假设 'data' 存在并且 data.items 存在,它将返回 data.items 处的值(我假设它是一个数组) - 否则它返回一个空数组。

答案 3 :(得分:0)

我构建了一个基本的测试来看看它是如何工作的,map((data: SearchResponse) => data && data.items || []) 在地图数据(真实)和数据之后,项目(真实)将通过 { } 在其他情况下将通过 [] 进行链接。

// let data = {"items": null } // []

let data = {"items": {} } // {}

//data = null // []

// let data = undefined  // []
 
console.log( data && data.items || [])

相关问题