簡體   English   中英

Array map和rxjs 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM