【问题标题】:Map operator returning integer as output with array as input映射运算符返回整数作为输出,数组作为输入
【发布时间】:2019-06-29 10:13:55
【问题描述】:

这是来自文档的示例代码。我是 RXJS 的新手,所以这可能真的很容易。

谁能解释 map 运算符在对数组进行操作后如何返回一位整数?

我检查了扫描运算符的返回值是一个从[0],[0,1],[0,1,2],[0,1,2,3] ....和以此类推。

// RxJS v6+
import { interval } from 'rxjs';
import { scan, map, distinctUntilChanged } from 'rxjs/operators';

// Accumulate values in an array, emit random values from this array.
const scanObs = interval(1000)
  .pipe(
    scan((a, c) => [...a, c], []),
    map(r => r[Math.floor(Math.random() * r.length)]),
    distinctUntilChanged()
  )
  .subscribe(console.log);

【问题讨论】:

  • map 此处将r(数组)映射到该数组r[...] 中的单个项目。所以它需要一个数组(number[])作为输入并输出一个随机项(number)。
  • 但是 map 在数组上的工作方式,它不应该获取数组的每个元素并执行操作并将其存储在数组中并返回数组。 Map通常对数组的每个值进行操作并返回数组

标签: javascript rxjs rxjs6 rxjs-pipeable-operators


【解决方案1】:

Interval 每秒发出一个递增的整数,scan 然后将该整数添加到一个数组中,然后 map 拉出该数组的一个随机元素, distinctUntilChanged 阻止它连续两次发出相同的数字。一种更有效的方法来获得一个随机数,其中最大可能的数字每次增加 1 会更有效

const { interval } = rxjs;
const { map, distinctUntilChanged } = rxjs.operators;

interval(1000).pipe(
  map(i => Math.ceil(Math.random() * i)),
  distinctUntilChanged()
).subscribe(val => { console.log(val); });
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.4.0/rxjs.umd.min.js"></script>

无需将所有先前的值存储在数组中。

【讨论】:

    猜你喜欢
    • 2014-11-10
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多