使用JavaScript在一个生成器上映射一个函数 [英] Mapping a function on a generator in JavaScript

查看:110
本文介绍了使用JavaScript在一个生成器上映射一个函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在JavaScript中有一个名为 generateNumbers 的生成器,另一个生成器 generateLargerNumbers ,它生成由 generateNumbers 并将函数 addOne 应用于它,如下所示:

返回值+ 1 
}

函数* generateNumbers(){
yield 1
产生2
产出3
}

函数* generateLargerNumbers(){
for(常量number of generateNumbers()){
yield addOne(数字)
}
}

有没有更简单的方法可以做到这一点从生成的值中构建一个数组?我在想像这样:

pre $ function $ generateLargerNumbers() )//显然不起作用


解决方案

没有内置的方式来映射 Generator 对象,但您可以推出自己的函数:

  const Generator = Object.getPrototypeOf(function *(){}); 
Generator.prototype.map = function *(mapper,thisArg){
for(const val of this){
yield mapper.call(thisArg,val);
}
};

现在你可以这样做:

  function generateLargerNumbers(){
return generateNumbers()。map(addOne);
}

  const Generator = Object.getPrototypeOf(function *(){}); Generator.prototype.map = function *(mapper,thisArg){for(const val this){yield mapper.call (thisArg,val); }}; function addOne(value){return value + 1} function * generateNumbers(){yield 1 yield 2 yield 3} function generateLargerNumbers(){return generateNumbers()。map(addOne)} console.log(... generateLargerNumbers ()) 


I have a generator called generateNumbers in JavaScript and another generator generateLargerNumbers which takes each value generated by generateNumbers and applies a function addOne to it, as such:

function addOne(value) {
  return value + 1
}

function* generateNumbers() {
  yield 1
  yield 2
  yield 3
}

function* generateLargerNumbers() {
  for (const number of generateNumbers()) {
    yield addOne(number)
  }
}

Is there any terser way to do this without building an array out of the generated values? I'm thinking something like:

function* generateLargerNumbers() {
  yield* generateNumbers().map(addOne) // obviously doesn't work
}

解决方案

There isn't a built-in way to map over Generator objects, but you could roll your own function:

const Generator = Object.getPrototypeOf(function* () {});
Generator.prototype.map = function* (mapper, thisArg) {
  for (const val of this) {
    yield mapper.call(thisArg, val);
  }
};

Now you can do:

function generateLargerNumbers() {
  return generateNumbers().map(addOne);
}

const Generator = Object.getPrototypeOf(function* () {});
Generator.prototype.map = function* (mapper, thisArg) {
  for (const val of this) {
    yield mapper.call(thisArg, val);
  }
};

function addOne(value) {
  return value + 1
}

function* generateNumbers() {
  yield 1
  yield 2
  yield 3
}

function generateLargerNumbers() {
  return generateNumbers().map(addOne)
}

console.log(...generateLargerNumbers())

这篇关于使用JavaScript在一个生成器上映射一个函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆