试过不用循环语句撸代码吗?

简介: 译者按: 通过使用数组的reduce、filter以及map方法来避免循环语句。原文: Coding Tip: Try to Code Without Loops译者: Fundebug为了保证可读性,本文采用意译而非直译。

译者按: 通过使用数组的reducefilter以及map方法来避免循环语句。

为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。

在前一篇博客,我们介绍了,如果不使用if语句的话,如何解决一些简单的编程问题。那么,这次我们不妨试试,在不使用循环语句的情况下,如何编程呢?

示例1: 数组元素求和

数组如下:

const arrayOfNumbers = [17, -4, 3.2, 8.9, -1.3, 0, Math.PI];

使用循环语句

let sum = 0;

arrayOfNumbers.forEach((number) => {
  sum += number;
});

console.log(sum);

可知,我们需要通过修改sum变量,来计算结果。

不用循环语句

使用reduce方法时,就可以避免使用循环语句了:

const sum = arrayOfNumbers.reduce((acc, number) =>
  acc + number
);

console.log(sum);

实现递归,同样可以避免使用循环语句:

const sum = ([number, ...rest]) => {
  if (rest.length === 0) { 
    return number;
  }
  return number + sum(rest);
};

console.log(sum(arrayOfNumbers))

可知,代码中巧妙地使用了一个ES6语法 - 扩展运算符rest代表了除去第一个元素之后的剩余数组,它的元素个数会随着一层层递归而减小直至为0,这样就满足了递归结束的条件。这种写法非常机智,但是在我看来,可读性并没有使用reduce方法那么好。

示例2: 将数组中的字符串拼接成句子

数组如下,我们需要过滤掉非字符串元素:

const dataArray = [0, 'H', {}, 'e', Math.PI, 'l', 'l', 2/9, 'o!'];

目标结果是“Hello!”.

使用循环语句

let string = '', i = 0;

while (dataArray[i] !== undefined) {
  if (typeof dataArray[i] === 'string') {
    string += dataArray[i];
  }
  i += 1;
}

console.log(string);

不用循环语句

使用filterjoin方法的话,可以避免使用循环语句:

const string = dataArray.filter(e => typeof e === 'string').join('');

console.log(string);

可知,使用filter方法还帮助我们省掉了if语句。

广而告之: 如果你需要监控线上JavaScript代码的错误的话,欢迎免费使用Fundebug!

示例3: 将数组元素变换为对象

数组元素为一些书名,需要将它们转换为对象,并为每一个对象添加ID:

const booksArray = [
  'Clean Code',
  'Code Complete',
  'Introduction to Algorithms',
];

目标结果如下:

newArray = [
  { id: 1, title: 'Clean Code' },
  { id: 2, title: 'Code Complete' },
  { id: 3, title: 'Introduction to Algorithms' },
];

使用循环语句

const newArray = [];
let counter = 1;

for (let title of booksArray) {
  newArray.push({
    id: counter,
    title,
  });

  counter += 1;
}

console.log(newArray);

不用循环语句

使用map方法的话,可以避免使用循环语句:

const newArray = booksArray.map((title, index) => ({ 
  id: index + 1, 
  title 
}));

console.log(newArray);

总结

img_35f853805aae14d8fbb9fce059ecc6ab.jpe

不难发现,我是通过使用数组的reducefilter以及map方法来避免循环语句的,这是我的个人偏好。使用它们,可以帮助我们做很多有意思的事情。上面的图片来自Steven Luscher,它们形象的表现了这3个方法的功能。

img_bb31b8cb2adb7b52a50d9e91733778b7.jpe

版权声明:
转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/11/13/write-javascript-without-loop/

目录
相关文章
|
6月前
|
SQL C# 数据安全/隐私保护
C真的不难学,不信就看下我关于循环的理解
C真的不难学,不信就看下我关于循环的理解
|
JavaScript
for-in循环一看就懂
for-in循环一看就懂
56 0
|
Python Windows
你真的看得懂报错吗?
你真的看得懂报错吗?
310 0
你真的看得懂报错吗?
|
编解码 前端开发 程序员
为啥只跟着视频敲代码学不好编程?
为啥只跟着视频敲代码学不好编程?
418 1
|
C语言 C++
我用c语言把何同学的代码跑起来了
我用c语言把何同学的代码跑起来了
204 0
我用c语言把何同学的代码跑起来了
|
SQL 存储 监控
聊聊那些年遇到过的奇葩代码
无论是开发新需求还是维护旧平台,在工作的过程中我们都会接触到各种样式的代码,有时候会碰到一些优秀的代码心中不免肃然起敬,但是更多的时候我们会遇到很多奇葩代码,有的时候骂骂咧咧的吐槽一段奇葩代码后定睛一看作者,居然是几个月以前自己的写的,心中难免浮现曹操的那句名言:不可能,绝对不可能。
聊聊那些年遇到过的奇葩代码
|
编译器
为何代码没错,却出不来结果,你可能...
为何代码没错,却出不来结果,你可能...
130 0
为何代码没错,却出不来结果,你可能...
|
算法 Java
别在网上乱找代码了,找了一段代码突然爆了!!!
本人是做游戏服务器开发的,碰到一个需求,给符某些要求的玩家的发送道具奖励,奖励的数量根据离线的天数计算。 这个需求实现起来很简单,只需要在玩家上线的时候计算上次离线时间和当前时间间隔的天数,然后根据策划的算法,计算出道具种类与数量,发一封邮件给玩家就可以了。