Каковы различия между картой массива и картой rxjs - PullRequest
0 голосов
/ 11 октября 2018

Мне было интересно, что карта как для rxjs, так и для массива работает одинаково.Каковы различия между использованием метода карты массива и оператора карты rxjs?

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Array.map преобразует каждый элемент одного массива.

console.log( [ 1, 2, 3 ].map(x => x * x) )
// log: [ 1, 4, 9 ]

В общем случае наблюдаемые объекты RXJS больше похожи на поток данных, но все данные являются егособственная сущность.

Вы можете хранить массивы в своем Observable, но, тем не менее, каждый массив обрабатывается как одна сущность.Каждый раз, когда вы вызываете Subject#next, вы предоставляете совершенно новый массив.В этом сценарии нет эквивалента Array#push с RXJS, потому что 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
0 голосов
/ 11 октября 2018

Их функционирование практически такое же, они дают новый массив / наблюдаемый (соответственно), в котором каждый элемент преобразован в соответствии с (обычно) функцией преобразования (техническое имя компьютерной науки будет проекция ),принимая в качестве параметра модифицированный объект и его индекс.

Array.map изначально является частью прототипа Array.Вы можете использовать его в любом массиве в любой среде JavaScript.(конечно, при условии, что вы не испортили прототип Array. *)

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 не нуждается в этом, потому что это функция, и вы также можете указать свой собственный "this" с различными способами вызова функций в JavaScript.(Я не нахожу хорошую ссылку для этой части, и любой, кто хочет добавить ссылку на это в этом ответе, приветствуется).

Кроме того, мне все равно было бы интересно оспорить этот последний пункт.

0 голосов
/ 11 октября 2018

RxJS - для работы с Observables, а собственный map - для Arrays.Это единственная разница, о которой я могу думать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...