马黑黑 发表于 2022-6-22 20:13

JS循环:for的多种玩法

本帖最后由 马黑黑 于 2022-6-22 20:17 编辑 <br /><br /><p>有一个奇葩的问题,就是,用最少的语句,将一个已知数组按三位数输出,不足三位数的前面补零。数组举例如下(不是原题提供的数组,但这不重要):<br><br></p>
<p>let arr = ;<br><br></p>
<p>我最先想到的是用 for of 循环语句,然后想到 for in、forEach 和 map。我先用 for of 做题:<br><br></p>
<p><span style="color: blue">for</span>(x of arr) console.log(x.<font color="#8b0000">toString</font>().<font color="#8b0000">padStart</font>(3,<span style="color: magenta">'0'</span>));<br><br></p>
<p>这里有三个知识点:</p><p><br></p><p>其一,for&nbsp;of&nbsp;循环语句,它针对数组元素,直接遍历数组元素的内容。例如,我们读出 arr&nbsp;每一个元素的内容,可以这样:</p><p><br></p><p>for(x of arr) {</p><p>&nbsp; &nbsp; console.log(x);</p><p>}</p><p><br></p><p>这将把数组&nbsp;arr&nbsp;每一个元素打印出来。</p><p><br></p><p>其二,toString()&nbsp;内置函数,将变量转换成字符串。因为题意是要求输出数组元素,而数组元素是整数,需要将其一一转为字符串,后续的补零操作才会成功。</p><p><br></p><p>其三,padStart()&nbsp;内置函数,这是格式化字符串的函数,给字符串的前面加字符,参数有两个,参数一表示最多补到多少位,位数足的不补,参数二表示用什么补。如果补在后面,则用函数 padEnd() ,参数一样。</p><p><br></p><p>for of&nbsp;针对数组,且直接遍历的是数组的元素自身。而——</p><p><br></p><p>for&nbsp;in&nbsp;循环语句则针对对象,且遍历的是对象元素的索引。由于数组也可以视为对象,所以 for&nbsp;in&nbsp;也能解答题目:</p><p><br></p><p><font color="#0000ff">for</font>(x <font color="#0000ff">in</font> arr) console.log(arr.<font color="#8b0000">toString</font>().<font color="#8b0000">padStart</font>(3,'0'));</p><p><br></p><p>for&nbsp;in 是遍历对象(数组)的索引,所以,读出数组元素内容方法是&nbsp;arr ,而不是 for&nbsp;of&nbsp;的 x&nbsp;那么直接。</p><p><br></p><p>其实还有&nbsp;forEach&nbsp;也是可以一句答题的:</p><p><br></p><p>arr.forEach((x) =&gt; console.log(x.toString().padStart(3,'0')));</p><p><br></p><p>不同的是,用 forEach&nbsp;要构造一个函数。它其实是标准 for&nbsp;循环语句的另一种表现方法,但&nbsp;forEach&nbsp;是一个独立的函数。</p><p><br></p><p>最后用&nbsp;map&nbsp;构建一个新的数组,然后输出新的数组,也可以一行完成:</p><p><br></p><p>console.log(arr.map((x) =&gt; x.toString().padStart(3,'0')));</p><p><br></p><p>map 是对已有数组的映射,但不是简单映射,是以对原数组元素执行函数操作后的结果而构建的全新数组,对原数组不做任何改动。</p><p><br></p><p>不知不觉就有了四种解题方法,估计还有更多,而且会比我想到的更精彩。</p><p><br></p><p><br></p>

小辣椒 发表于 2022-6-22 21:02

黑黑你一直在论坛?

我刚才又不能进来了

马黑黑 发表于 2022-6-22 21:04

小辣椒 发表于 2022-6-22 21:02
黑黑你一直在论坛?

我刚才又不能进来了

我挂着,但不一定都刷新,没有感觉到论坛不能访问的情况

小辣椒 发表于 2022-6-22 21:10

马黑黑 发表于 2022-6-22 21:04
我挂着,但不一定都刷新,没有感觉到论坛不能访问的情况

队长到现在都不能进来

小辣椒 发表于 2022-6-22 21:11

不过我一直手机,今天还没有回家,有点迟了

马黑黑 发表于 2022-6-22 21:12

小辣椒 发表于 2022-6-22 21:11
不过我一直手机,今天还没有回家,有点迟了

手机是说不清楚的,特别是这个时候,基站负担都会很重

马黑黑 发表于 2022-6-22 21:13

小辣椒 发表于 2022-6-22 21:10
队长到现在都不能进来

如果会,重启家里的路由看看,不会的就算了

樵歌 发表于 2022-6-23 08:09

新的仙术出笼了{:4_189:}

红影 发表于 2022-6-23 09:16

看得发晕,JS我是弄不懂了{:4_173:}

红影 发表于 2022-6-23 09:29

黑黑太厉害了,能找到四种之多。而且把四种放在一起比较,更容易看出它们之间的构成方式。

看了一下,四种都要用到将变量转换成字符串的toString() 内置函数和格式化字符串的padStart() 内置函数,而每种方法针对的对象和实现方式不同。

红影 发表于 2022-6-23 09:39

通过比较,貌似其他三种都是针对数组,只有for in是针对对象的?因为之看到它有arr,其他的都直接是x

马黑黑 发表于 2022-6-23 12:18

红影 发表于 2022-6-23 09:39
通过比较,貌似其他三种都是针对数组,只有for in是针对对象的?因为之看到它有arr,其他的都直接是x

对象和数组结构其实差不多的

红影 发表于 2022-6-23 16:19

马黑黑 发表于 2022-6-23 12:18
对象和数组结构其实差不多的

哦哦,那等于四种针对的都差不多。

马黑黑 发表于 2022-6-23 19:54

红影 发表于 2022-6-23 16:19
哦哦,那等于四种针对的都差不多。

都可以,只是有些细节要注意

红影 发表于 2022-6-24 13:59

马黑黑 发表于 2022-6-23 19:54
都可以,只是有些细节要注意

嗯嗯,这四种的语句不同,虽然都能达到目的。

马黑黑 发表于 2022-6-24 19:14

红影 发表于 2022-6-24 13:59
嗯嗯,这四种的语句不同,虽然都能达到目的。

具体情况还有具体分析,总是有区别的
页: [1]
查看完整版本: JS循环:for的多种玩法