我有一个作业,我用扩展形式写一个数字并将其显示为字符串。
例如:
expandedForm(7020); // should return '7000 + 20';
expandedForm(7402); // '7000 + 400 + 2';
我还没有弄清楚所有内容,但是我当前的代码如下:
function expandedForm(num) {
let numArr = Array.from(num.toString()).map(Number),
counter = numArr.length,
answer = "";
for(let i = 0; i < numArr.length; i++) {
(numArr[i] === 0) ? counter-- : --counter;
console.log(numArr[i].toString(), counter);
}
}
expandedForm(702); // returns '7' 2 and '2' 0
我跳过0,因为应该忽略它,遍历每个整数,并使用计数器检查它具有的单位数量。这很有用,但是现在我正尝试基于counter
值将'00'添加到'7'中。因此,如果counter
为2,则需要添加两个0作为字符串'00'。
我不太可能采用最佳做法来执行此操作,因此,如果应该对已有的内容进行其他处理,请提出建议。谢谢。
答案 0 :(得分:4)
"0".repeat(counter)
就这样...然后将所有这些都连接到字符串,就可以完成:)
还请注意:
(numArr[i] === 0) ? counter-- : --counter;
基本上等于counter--;
。
“最佳做法”基于意见,这是我的做法:
const chars = [...("" + input)];
return chars
.map((char, i) => char + "0".repeat(chars.length - i - 1))
.filter(it => it[0] !== "0")
.join(" + ");
答案 1 :(得分:3)
如果您对代码打高尔夫球感兴趣(这很有趣,但并不总是“最佳实践”),则可以使用:
[...`${input}`].map((c,i,a)=>c.padEnd(a.length-i,'0')).filter(c=>+c).join(' + ')
这里正在起作用:
> input = 2
> [...`${input}`].map((c,i,a)=>c.padEnd(a.length-i,'0')).filter(c=>+c).join(' + ')
'2'
> input = 200
> [...`${input}`].map((c,i,a)=>c.padEnd(a.length-i,'0')).filter(c=>+c).join(' + ')
'200'
> input = 209777800001
> [...`${input}`].map((c,i,a)=>c.padEnd(a.length-i,'0')).filter(c=>+c).join(' + ')
'200000000000 + 9000000000 + 700000000 + 70000000 + 7000000 + 800000 + 1'
这是它的工作方式:
[...`${input}`]
根据您的电话号码中的数字组成一个数组。例如,7503变为['7', '5', '0', '3']
.map((c,i,a)=>c.padEnd(a.length-i,'0'))
使用正确的零数字将每个数字映射到其填充。 map
的回调使用数字,数组索引和数组本身。对于正在运行的示例,这为我们提供了['7000', '500', '00', '3']
.filter(c=>+c)
从数组中删除任何零字符串,例如"0"
,"0000"
等。现在我们有了['7000', '500', '3']
.join(' + ')
做看起来像它的事情。
这是此解决方案无法做到的:
第一个可以通过修复
[...`${input}`].map((c,i,a)=>c.padEnd(a.length-i,'0')).filter(c=>+c).join(' + ') || '0'
由于这是一项任务,因此我将其他两种情况留给您。
也很乐意向分配给您问题的人解释这一点。 ;-)
如另一个答案中所述,最佳实践是主观的。通过引入中间变量,您可以更加明确:
const chars = Array.from(`${input}`);
const places = chars.map((c, i, a) => c.padEnd(a.length - i, '0'));
const nonZeros = places.filter(c => Number(c) !== 0);
const result = nonZeros.join(' + ') || '0';
同样,最佳实践也将需要您进行一些错误处理。如果您输入的是NaN或字符串,数组或对象怎么办?如果是无限怎么办?浮点数?