![](/img/trans.png)
[英]What are the differences between the two ways to implement Array.prototype.map
[英]What are the differences between Array map and rxjs map
我想知道rxjs和數組上的映射是一樣的。 數組映射方法和rxjs映射運算符的使用有何不同?
Array.map
轉換單個數組的每個元素 。
console.log( [ 1, 2, 3 ].map(x => x * x) )
// log: [ 1, 4, 9 ]
通常,RXJS Observables更像是一個數據流,但每個數據都是它自己的實體。
您可以選擇在Observable中存儲數組,但仍然會將每個數組視為單個實體。 每當你調用Subject#next
,你就會提供一個全新的數組。 在這種情況下,沒有與使用RXJS的Array#push
等效,因為RXJS並不關心 Observable的內容恰好是一個數組。
// Observable that holds an array as its type
const subject: Subject<number[]> = new Subject<number[]>();
subject.pipe(
// the value here is a full array
map(arr => arr.map(x => x * x))
).subscribe(arr => console.log(arr));
subject.next([ 1, 2, 3 ]);
// log: [ 1, 4, 9 ]
subject.next([ 7, 8, 9 ]);
// log: [ 49, 64, 81 ]
*優點:您可以還挺使一些行為更像是一個數組,如果你設置了ReplaySubject
。 Subject
這個實現實際上重放了給它的所有數據(或者基於你如何實例化它的子集)。 正如您所看到的,對此的限制將是您只能推到最后,並且您必須創建一個新的訂閱以查看整個“數組”,但它仍然是一個有趣的思想實驗。
const subject: ReplaySubject<number> = new ReplaySubject<number>();
subject.next(1);
subject.next(2);
subject.next(3);
const transformed: Observable<number> = subject.pipe(
map(x => x * x)
);
transformed.pipe(first()).subscribe(x => console.log(x));
// log: 1
// log: 4
// log: 9
subject.next(9);
transformed.pipe(first()).subscribe(x => console.log(x));
// log: 1
// log: 4
// log: 9
// log: 81
它們的功能完全相同,它們分別給出一個新的Array / Observable,每個元素根據(通常)轉換函數(技術計算機科學名稱將是一個投影 )進行轉換,將修改后的對象及其索引作為參數。
Array.map
就是Array原型的一部分。 您可以在任何JavaScript環境中的任何陣列上使用它。 (當然你沒有弄亂Array.prototype)
必須導入Observable.map
。 (對於RxJS 6: import { map } from 'rxjs/operators';
對於舊版本: import { map } from 'rxjs/add/operator/map'
Array.map
轉換函數可以訪問正在轉換的整個數組 (投影函數中的第三個參數)。
例如:
let arr = ['a', 'b', 'c']; let arrResult = arr.map( (elem, index, wholeArray) => 'element ' + elem + ' was in position ' + index + ' in array ' + wholeArray); console.log(arrResult);
這在“Observable”的上下文中“當然”是不可能的(一般來說),因為在發出每個元素時可能不知道發射值的“整個列表”。
相反,還有另一個小的區別: Observable.map
運算符采用(可選) thisArg
參數,因此轉換函數可以訪問某些指定的上下文。
我認為這另一個區別是非常微不足道的: Array.map
不需要這個,因為它是一個函數,您還可以使用各種方法在JavaScript中調用函數來指定自己的“ this
”。 (我沒有找到這個部分的一個很好的鏈接,任何想要在這個答案中添加參考的人都是受歡迎的)。
此外,無論如何,我覺得有趣的是在最后一點上受到挑戰。
RxJS用於處理Observables
而原生map
用於Arrays
。 這是我能想到的唯一差異。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.