繁体   English   中英

RxJS 中的 `map` 方法是什么意思?

[英]What does the `map` method mean in RxJS?

我正在通过阅读本教程http://reactive-extensions.github.io/learnrx/学习RxJS

我很难理解Observablemap方法。 mapArray版本非常简单明了。 我不知道mapObservable情况下究竟意味着什么(以及为什么它有一个名为select的别名?!)。

这是文档告诉我的。 可能对大多数初学者没有帮助...

通过合并元素的索引,将可观察序列的每个元素投影到新形式中。 这是 select 方法的别名。

我不理解event上下文中的map 例如,下面的代码完全符合我的预期。 我认为这段代码是:“从#btn的事件流中监听click-event ”。

 var btnClicks, observable; btnClicks = Rx.Observable.fromEvent($('#btn'), "click"); observable = btnClicks.subscribe(function(e) { console.log(e); });

但是当它变成这个时会发生什么??

 var btn2Clicks, btnClicks, observable; btnClicks = Rx.Observable.fromEvent($('#btn'), "click"); btn2Clicks = Rx.Observable.fromEvent($('#btn2'), "click"); observable = btnClicks.map(function(e) { return btn2Clicks; }).subscribe(function(e) { console.log(e); });

我的想法是使用map将一个点击事件集合转换为另一个事件集合集合。 filter很容易理解,就像filter这个词的意思,只取我感兴趣的事件,其他跳过。 但是在event上下文中的map怎么样? 如果它意味着“将一个集合转换为另一个集合”就像数组版本一样,为什么在单击#btn时它仍然会触发??

我的意思是我已经将它映射到另一个集合,现在它不再是#btn的点击事件的#btn而是一个新的集合......但是当#btn点击时它仍然会触发,这对我来说没有意义。

map对 Observables 的作用与对数组的作用完全相同。 您可以使用map将项目集合转换为不同项目的集合。 如果您将 Observable 视为项目的集合(就像数组也是项目的集合),至少从观察者的角度来看,这会有所帮助。

例如,将您编写的这 2 个方法用于某些数组:

function multiplyByTwo(collection) {
    return collection.map(function (value) {
        return value * 2;
    });
}

function removeZeroes(collection) {
    return collection.filter(function (value) {
        return value !== 0;
    });
}

var a = [1, 2, 3, 4, 0, 5];
var b = multiplyByTwo(a); // a new array [2, 4, 6, 8, 0, 10]
var c = removeZeroes(b); // a new array [2, 4, 6, 8, 10]

您可以对 observable 使用这些相同的函数

var a = Rx.Observable.of(1, 2, 3, 4, 0, 5);
var b = multiplyByTwo(a); // a new observable [2, 4, 6, 8, 0, 10]
var c = removeZeroes(b); // a new observable [2, 4, 6, 8, 10]

这是可能的,因为 RxJs observables 实现了像mapfilter这样的数组运算符,以具有与数组完全相同的语义。 如果您知道它们如何用于数组,那么您就知道它们如何用于 observable。

这个技巧是observables 和 enumerables 双重性质的结果。

如果您完成正在查看的交互式教程,它实际上会引导您完成此过程。 我相信它通过为数组编写映射运算符开始,然后在以后的教程中将 observable 作为源。

PS 由于它的历史,它是select的别名:Reactive Extensions 首先在 .NET 中实现,后来移植到其他语言。 Rx.NET 使用与 .NET 的 LINQ 相同的运算符(因为IObservableIEnumerable对偶)。 LINQ 的 map 运算符称为Select (其过滤器运算符称为Where )。 这些名称来自 LINQ 的起源。 构建 LINQ 时的目标之一是使用 C# 编写数据库查询成为可能。 因此,他们为许多运算符采用了 SQL 命名约定(LINQ SELECT 直接映射到 SQL SELECT,LINQ WHERE 映射到 SQL WHERE 等)。

Rxjs 中的 Map 用于投影,这意味着您可以将数组转换为全新的数组。 为了理解 Map 是如何工作的,我们可以使用普通的 javascript 实现我们自己的 map 函数。

Array.prototype.map = function(projectionFunction){
  var results=[];
  this.forEach(function(item) {
    results.push(projectionFunction(item));
  });
  return results;
};

你可以看到我写了一个 map 函数,它接受一个匿名函数作为参数。 这将是您应用投影来转换数组的函数。 在 map 函数内部,您可以看到迭代数组中的每个项目,通过传递每个项目调用 project 函数,最后将投影函数的结果推送到 results 数组。

JSON.stringify([1,2,3].map(function(x){return x+1;}))

输出

[2,3,4]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM