博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NodeSchool: JavaScript函数式编程
阅读量:5980 次
发布时间:2019-06-20

本文共 4563 字,大约阅读时间需要 15 分钟。

  hot3.png

习题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

你可能感兴趣的文章
(转) ACM必备(学完一个就加亮一个)不多,就这些!
查看>>
数字图像处理中所用数学工具4---集合、逻辑操作与模糊集合
查看>>
java学习之租车系统
查看>>
【杭电ACM】1004 Let the Balloon Rise
查看>>
2018年5月26日笔记
查看>>
arcgis裁剪失败
查看>>
《高性能MySQL》--复制笔记
查看>>
3.07 检测两个表中是否有相同的数据
查看>>
价值投资
查看>>
eclipse 使用Maven deploy命令部署构建到Nexus
查看>>
DAG模型
查看>>
AHK按键转载
查看>>
深浅拷贝 python
查看>>
C++ gui程序附加dos输出窗口
查看>>
jQuery验证控件jquery.validate.js使用说明+中文API
查看>>
Linux 查看.so中导出函数
查看>>
数组中简便方法求最大值,最小值,平均值,求和,和个数
查看>>
洛谷P4219 大融合
查看>>
adb 查看 android手机的CPU架构
查看>>
Java概述
查看>>