背景
实习快要结束,临近春招,马上毕业,又赶上新冠病毒横行霸道,不敢出门,在这些氛围的压迫下,所以看了一些面试题,其中有一道算不上难题问题,。
题面 : let num = 12345678
改为 12,345,678
当时脑子里第一时间想到的是用join('')
方法,因为它的作用是将一个数组按指定的符号,分割成一个字符串。
- 首先,
num
是数字,我需要用toString
方法把它转化为字符串,然后用split
方法将其拆成一个数组,并设置一个空数组arr2
和数组长度lg
供下面分离使用。
let num = 12345678;
let arr = num.toString().split('') // ["1", "2", "3", "4", "5", "6", "7", "8"]
let arr2 = [];
const lg = arr.length;
- 接下来需要构造我们的目标数组
[*,***,***] || [**,***,***] || [***,***,***]
,代码如下。
arr.forEach((e, index, array) => {
if ((index + 1) * 3 > lg) {
let arr3 = lg % 3 === 2
? [arr[lg - 2 - Math.floor(lg / 3) * 3], arr[lg - 1 - Math.floor(lg / 3) * 3]]
: [arr[lg - 1 - Math.floor(lg / 3)]];
arr2.unshift(arr3.join(''));
return
}
let arr3 = [arr[lg - 3 - (index * 3)], arr[lg - 2 - (index * 3)], arr[lg - 1 - (index * 3)]]
arr2.unshift(arr3.join(''));
});
看!是不是十分的复杂!
其实在写到一半的时候我就想放弃,老老实实的用for
循环,然后拼接字符串好了,但是内心傲娇的说,不行!我必须要用join()
办法!
其中有几点要说的
1.在forEach()中使用return只是中止当前次循环,并不会阻止整体循环,被操作的数组长度为n,它就会循环n次,所以大概率会出现重复的字符,后面需要做去重处理。
2.在js中,被除数如果不能够除尽,会用小数点产生,Math.floor
是向下取整。
const arr4 = arr2.splice(-Math.ceil(lg / 3), Math.ceil(lg / 3))
console.log(arr4.join(',')) // 12,345,678
要注意的是
splice
方法返回的是被删除的数,且会改变原数组,此时的arr2
为["12", "12", "12", "12", "12"]
。
呼呼(大喘气)废了九牛二虎之力终于把它给做出来了。
迫不及待的去看了一眼答案
let num = 12345678
console.log(num.toLocaleString()) //12,345,678
心态崩了。