Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 试图理解以下代码:map((data:SearchResponse)=>;data&;data.items | |[])_Angular_Typescript_Angular11 - Fatal编程技术网

Angular 试图理解以下代码:map((data:SearchResponse)=>;data&;data.items | |[])

Angular 试图理解以下代码:map((data:SearchResponse)=>;data&;data.items | |[]),angular,typescript,angular11,Angular,Typescript,Angular11,我是Angular的新手,正在尝试通过检查代码样本来学习。我为ngx Typeahead提取了一些示例代码,并试图理解这些代码 interface SearchResponse { total_count: number; incomplete_results: boolean; items: Owner[]; } 然后 读取类似“将响应映射到此函数并将其称为“数据”的内容。然后使用此函数,并将其与项(SearchResponse的一个元素)一起读取。如果该和为空,则返回一个空数组

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

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


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

使用
&&
|
这样的方法是
if
/
else
检查值或获取默认值的缩写

data&&data.items | |【】
if(data&&data.items)data.items else【】
(或
(data&&data.items)?data.items:【】
。也就是说,如果定义了
数据且
数据.items
没有错误(例如非空数组),您将获得
数据。items
。否则,您将获得一个空数组

这是因为在Typescript中,
&&
| |
运算符始终返回其参数之一:

  • a和&b
    a
    如果
    a
    为假,或
    b
  • 如果
    a
    是真实的,或者
    b
而且,由于它们会短路(仅在需要时计算操作数),所以可以使用它们在访问某个值之前检查该值


这意味着,如果
data.items
存在且非空,
data&&data.items
将是该值。否则,它将是一个伪值,
(该值)|【】
将成为空数组——默认值。

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

这是一个速记,以确保您使用的是正确定义的值,在本例中为数组。当使用对象作为这样的条件时,如果对象存在,它的行为就好像它是
True
,如果它不存在,它的行为就好像它是
False
(即空、未定义、0等)如果
data
是一个非空的已定义对象,则该语言处理该对象的另一端。如果
data.items
是一个非空的已定义对象,则表达式短路。
true&&true | | |?
不需要处理第三个元素就知道表达式的计算结果为true。但表达式不返回
true
,它返回上一次计算的条件,因此如果
data
data.items
都是非空的定义对象,它将返回
data.item

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

如果
data
data.items
都不包含值,则返回空数组

我认为
数据
不可能为空或未定义,
数据项
不可能抛出错误


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

我构建了一个基本测试,看看它是如何工作的,
映射((数据:SearchResponse)=>数据和数据.items | |[])
映射数据之后(truthy和数据,项(truthy)将通过{},在其他情况下,将通过[]进行链接

//let data={“items”:null}//[]
让数据={“项”:{}/{}
//数据=null/[]
//让数据=未定义//[]

console.log(data&data.items | |【】)
数据和data.items
将返回
数据。如果数据不为空,items
将返回
数据。使用
数据和data.items |【】
时,如果
数据为空或data.items为空/不存在,则返回空数组。
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 || [])