根据计数器长度添加字符串吗?

时间:2019-07-06 22:57:19

标签: javascript

我有一个作业,我用扩展形式写一个数字并将其显示为字符串。

例如:

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'。

我不太可能采用最佳做法来执行此操作,因此,如果应该对已有的内容进行其他处理,请提出建议。谢谢。

2 个答案:

答案 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(' + ')

做看起来像它的事情。

这是此解决方案无法做到的:

  1. 处理值0(因为您得到一个空字符串)
  2. 处理负数
  3. 处理非整数

第一个可以通过修复

[...`${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或字符串,数组或对象怎么办?如果是无限怎么办?浮点数?