为什么80%的码农都做不了架构师?>>>   

习题1: 编写函数, 将输入字符串转成大写输出.

function upperCaser(input) {return input.toUpperCase();
}module.exports = upperCaser;

习题2: 编写函数, 输入两个参数, 第一个参数为一函数, 第二个参数代表函数的执行次数.

function repeat(operation, num) {num = parseInt(num);while (num--) {operation();}
}module.exports = repeat;

习题3: 使用map函数对以下函数进行简化:

function doubleAll(numbers) {var result = []for (var i = 0; i < numbers.length; i++) {result.push(numbers[i] * 2)}return result
}module.exports = doubleAll

转换:

function doubleAll(numbers) {return numbers.map(function(item) {return item * 2;});
}module.exports = doubleAll;

习题4: 输入一个数组, 数组的元素位{message: '***'}, 输出长度小于50的字符串组成的数组:

function getShortMessages(messages) {return messages.filter(function(item) {return item.message.length < 50;}).map(function(item) {return item.message;});
}module.exports = getShortMessages;

习题5: 编写一个函数, 判断所输出的子数组是否在父数组中.

function checkUsersValid(goodUsers) {return function allUsersValid(submittedUsers) {return submittedUsers.every(function(item) {return goodUsers.indexOf(item) !== -1;});};
}module.exports = checkUsersValid;

习题6: 给予一个数组, 统计出现元素的个数:

function countWords(inputWords) {return inputWords.reduce(function(result, item) {result[item] = (result[item] || 0) + 1;return result;}, {});
}module.exports = countWords;

习题7: 使用简易版的reduce函数

function reduce(arr, fn, initial) {if (!arr.length) return initial;return reduce(arr.slice(1), fn, fn(initial, arr[0]));
}module.exports = reduce;

习题8: 编写函数, 判断所输入的参数中有quack属性的个数.

function duckCount() {var count = 0;for (var i = 0; i < arguments.length; i++) {if (Object.prototype.hasOwnProperty.call(arguments[i], 'quack')) {count++;}}return count;
}module.exports = duckCount;

习题9: 实现简易版的log函数, 使用apply.

var info = logger('INFO:')
info('this is an info message')
// INFO: this is an info messagevar warn = logger('WARN:')
warn('this is a warning message', 'with more info')
// WARN: this is a warning message with more info

实现:

var slice = Array.prototype.slice;function logger(namespace) {return function log() {console.log.apply(null, [namespace].concat(slice.apply(arguments)));}
}module.exports = logger;

习题10: 使用bind实现log函数

module.exports = function(namespace) {return console.log.bind(console, namespace);
}

习题11: 使用reduce实现map

module.exports = function arrayMap(arr, fn) {return arr.reduce(function(result, item) {result.push(fn(item));return result;}, []);
};

习题12: 判断函数执行的次数, 例如:

var spy = Spy(console, 'error')console.error('calling console.error')
console.error('calling console.error')
console.error('calling console.error')console.log(spy.count) // 3

实现:

function Spy(target, method) {var m = target[method];var result = {count: 0};target[method] = function() {result.count++;return m.apply(this, arguments);};return result;
}module.exports = Spy;

习题13: 非阻塞执行递归函数, 使用新的setImmediate函数.

function repeat(operation, num) {if (num <= 0) return;operation();setImmediate(function() {repeat(operation, --num);});
}module.exports = repeat;

习题14: repeat递归执行情况下, 会存在堆栈溢出(由于函数调用函数, 则调用过多就造成堆栈溢出).

解决方案就是: 函数执行完一次, 将第二次执行的函数赋值给第一个函数, 保证函数数量不会递增:

function repeat(operation, num) {return function() {if (num <= 0) return;operation();return repeat(operation, --num);};
}function trampoline(fn) {while (fn && typeof fn === 'function') {fn = fn();}
}module.exports = function(operation, num) {trampoline(function() {return repeat(operation, num);});
};

备注: 此答案来自论坛给出的结果, 个人没想到如此解决.

习题15: 考虑如下函数:

function loadUsers(userIds, load, done) {var users = []for (var i = 0; i < userIds.length; i++) {users.push(load(userIds[i]))}return users
}module.exports = loadUsers

由于load为异步函数, 则代码有误! 修改如下:

function loadUsers(userIds, load, done) {if (!userIds.length) {done();return;}load(userIds[0], function(result) {return loadUsers(userIds.slice(1), load, done);});
}module.exports = loadUsers;

习题16: 递归一个dependencies, 获取其包+版本号, 并排序, 不允许重复值.

function getDependencies(tree) {var items = tree.dependencies;if (!items) return [];var arr = Object.keys(items).reduce(function(arr, k) {if (items[k].hasOwnProperty('version')) {arr.push(k + '@' + items[k].version);}if (items[k].hasOwnProperty('dependencies')) {arr = arr.concat(getDependencies(items[k]));}return arr;}, []);arr.sort();arr = arr.filter(function(item, index) {return arr.indexOf(item) === index;});return arr;
}module.exports = getDependencies;

习题17和习题18不会做.....

转载于:https://my.oschina.net/voler/blog/820209

NodeSchool: JavaScript函数式编程相关推荐

  1. 我眼中的JavaScript函数式编程

    JavaScript 函数式编程是一个存在了很久的话题,但似乎从 2016 年开始,它变得越来越火热.这可能是因为 ES6 语法对于函数式编程更为友好,也可能是因为诸如 RxJS (ReactiveX ...

  2. JavaScript函数式编程之深入理解纯函数

    更多相关内容见博客 https://github.com/zhuanyongxigua/blog 纯函数是函数式编程的基础,需要重点理解. 纯函数的概念: 纯函数是这样一种函数,即相同的输入,永远会得 ...

  3. JavaScript函数式编程入门经典

    一个持续更新的github笔记,链接地址:Front-End-Basics,可以watch,也可以star. 此篇文章的地址:JavaScript函数式编程入门经典 正文开始 什么是函数式编程?为何它 ...

  4. SegmentFault 技术周刊 Vol.16 - 浅入浅出 JavaScript 函数式编程

    函数式编程(Functional Programming),一看这个词,简直就是学院派的典范. 以至于从 Lisp 的创世,到 Scheme.Haskell.Clean.Erlang.Miranda. ...

  5. 一文带你了解JavaScript 函数式编程

    前言 函数式编程在前端已经成为了一个非常热门的话题.在最近几年里,我们看到非常多的应用程序代码库里大量使用着函数式编程思想. 本文将略去那些晦涩难懂的概念介绍,重点展示在 JavaScript 中到底 ...

  6. 一文带你了解JavaScript函数式编程

    摘要: 函数式编程入门. 作者:浪里行舟 Fundebug经授权转载,版权归原作者所有. 前言 函数式编程在前端已经成为了一个非常热门的话题.在最近几年里,我们看到非常多的应用程序代码库里大量使用着函 ...

  7. JavaScript函数式编程(二)

    上一篇文章 JavaScript函数式编程(一)   里我们提到了纯函数的概念,所谓的纯函数就是,对于相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用,也不依赖外部环境的状态(我偷懒复制过 ...

  8. SegmentFault 技术周刊 Vol.16 - 浅入浅出 JavaScript 函数式编程 1

    函数式编程(Functional Programming),一看这个词,简直就是学院派的典范. 以至于从 Lisp 的创世,到 Scheme.Haskell.Clean.Erlang.Miranda. ...

  9. 《JavaScript函数式编程思想》——递归

    第7章  递归 王二.张三和赵四一日无聊,决定玩击鼓传花讲冷笑话的游戏.王二和张三围成一圈传花,赵四负责击鼓.张三接连讲了几个诸如小菜.狐狸狡猾的笑话.花停在了王二的手中. 王二:这个笑话很短.你要保 ...

最新文章

  1. Recipe 1.6. Converting Between Characters and Values
  2. php imagemagick 漏洞,ImageMagick漏洞EXP简易生成脚本
  3. Lesson 7 (3) 深入理解PyTorch与PyTorch库架构
  4. 信息系统项目管理师:第6章:项目进度管理(3)-章节重点汇总
  5. ov7725摄像头调试经验-寄存器配置
  6. acm用java怎么写_用java来写ACM
  7. 条件CSS的高级用法
  8. 爬虫python能做什么-Python除了爬虫,还能干啥?
  9. python怎么用for循环找出最大值_从“for in”循环中获取最小值和最大值
  10. 简单整理 - 常用设计模式
  11. Atitit oracle新特性5 6 7 8 9 10 11 12 18 19 20 attilax总结 目录 1.1. :ora 20c 1 1.2. Oracle Database 19c 的
  12. 十年期货股票行情数据轻松处理——TDengine在同心源基金的应用
  13. 天极游戏2005年度回顾:电视游戏篇
  14. Android仿微信新消息提示音
  15. Arduino ESP32 通过定时器(Timer)功能唤醒深度睡眠
  16. 基于WeX5平台开发微信公众号中的在线问卷调查
  17. 运放搭建的跟随电路作用与分析
  18. 宽带服务器无响应678,宽带连接错误678解决方法
  19. 记一次机器内存过高引起的线上故障
  20. 决策树(一)——构建决策树

热门文章

  1. 2005服务器文件夹网页设设置,设置VSS2005使支持通过Internet访问
  2. html本文框百分比定位,HTML中三种定位relative,absolute,fixed后,盒子的百分比宽度及位置易错点...
  3. linux 免sudo,linux 创建用户,免密sudo,ssh免密登录
  4. php mysql增删查改 主码不能修改_关系规范化中的删除操作异常是指什么
  5. mybatis分页插件_MyBatis 分页插件 5.2.0 发布
  6. oracle optimizermode,Oracle OPTIMIZER_MODE参数
  7. Fence Repair (二叉树求解)(优先队列,先取出小的)
  8. 多重背包(dp专题)
  9. Python标准库中的io
  10. java redirect 超时_会话超时后,Spring安全性不会重定向到上次请求的页面登录