我是 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 以便返回整个数据项?
答案 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 && b
为 a
,如果 a
为假,或 b
a || b
是 a
如果 a
是真的,或者 b
而且由于它们短路(仅在需要时评估操作数),您可以使用它们在访问值之前检查它。
这意味着如果 data.items
存在且非空,则 data && data.items
将是该值。否则,它将是一个假值,(that value) || []
将成为空数组---默认值。
答案 1 :(得分:1)
这是确保您使用正确定义的值(在本例中为数组)的简写。当使用一个对象作为这样的条件时,如果对象存在,它的行为就好像它是 True
,如果它不存在,它的行为就好像它是 False
(即 null、undefined、0 等)。如果 data
是一个非空的、已定义的东西,那么语言会处理 AND 的另一端。如果 data.items
是一个非空的、已定义的事物,则表达式短路。 true && true || ???
不需要处理第三个元素来知道表达式的计算结果为真。但是表达式不返回 true
,它返回最后计算的条件,所以如果 data
和 data.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 || [])