【问题标题】:Why can I not push a number into my array of strings even though I have converted the number back to a string?为什么即使我已将数字转换回字符串,我也不能将数字推送到我的字符串数组中?
【发布时间】:2021-05-19 20:49:01
【问题描述】:

您好,我正在尝试进行代码大战 kata:https://www.codewars.com/kata/54a91a4883a7de5d7800009c/train/javascript

我知道我所做的很冗长,但我想在重构之前一步一步地做。

  1. 我已经拆分了用户输入的字符串
  2. 通过数组过滤只是为了得到数字并将其转换为NUMBER
  3. 将该数字增加 1
  4. 将数字改回字符串
  5. 现在我想将我的字符串编号添加到原始数组中,但它不起作用,我不明白为什么:S

我知道这不是 kata 的最终答案,但我只是在尝试,想知道为什么这不起作用...

function isNumeric(num){
 return !isNaN(num)
}

function incrementString (string) {
  const splitString = string.split("");

  let numbers = Number(splitString.filter(el => isNumeric(el)).join("")); //[
  'f', 'o', 'o', 'b',
  'a', 'r', '0', '0',
  '4', '2'
]

  let incrementNumber = numbers +=1; // 43

  let revertNumberToString = incrementNumber.toString(); // "43"

  let test = splitString.push(revertNumberToString); // why can I not push the number 43 onto my original array?

  console.log(test); // 11? why?

}

incrementString("foobar0042")

【问题讨论】:

  • 它的工作 - 试试这个console.log(splitString);。当您返回 .push() 方法时,您将获得更新后数组的长度作为返回值 - 在本例中为 11
  • @Lain .filter(Number) 将删除 是数字但也是假的零。

标签: javascript arrays algorithm


【解决方案1】:

它似乎工作正常。如果您在推送到它后再次检查 splitString,那么它将包含所有 11 个项目。这就是数字 11 的来源。当您将推送保存到变量时,它不会创建新数组,而是保存新数组的长度。

  console.log(splitString)
  // ["f", "o", "o", "b", "a", "r", "0", "0", "4", "2"]
  let test = splitString.push(revertNumberToString);
  console.log(splitString)
  // ["f", "o", "o", "b", "a", "r", "0", "0", "4", "2", 43]
  console.log(test); // 11? why?

【讨论】:

  • 这应该是一条评论。努力发布高质量的答案(这可能会被否决)以获得足够的代表来发表评论。
  • 是的,我还不能发表评论,我想让我的代表起来,所以我可以把它作为评论而不是答案发布
  • 是的,但是像这样发布“答案”并不能帮助您提高声誉。由于可能会被否决,它会让你的代表保持低水平。
  • 哦,好吧,我明白了,push 方法添加了元素,但随后将元素的数量存储在数组而不是数组中......哇很高兴知道这一点
【解决方案2】:

Javascript push 方法将元素添加到数组并返回长度,这就是为什么你得到 11 而不是数组本身。 Reference

【讨论】:

  • 哦,我明白了,谢谢你的解释和参考,现在我可以继续使用kata了
【解决方案3】:

您可以采用不同的方法,将值拆分为字符串和数字部分,并获取数字部分的长度,以便稍后用前导零填充值。

function incrementString(value) {
    const
        string = (value.match(/\D+/) || [''])[0],
        number = (value.match(/\d+/) || ['0'])[0];

    return string + (+number + 1).toString().padStart(number.length, 0);
}

function assertEquals(a, b) {
    console.log(a === b, a, b);
}

assertEquals(incrementString("foobar000"), "foobar001");
assertEquals(incrementString("foo"), "foo1");
assertEquals(incrementString("foobar001"), "foobar002");
assertEquals(incrementString("foobar99"), "foobar100");
assertEquals(incrementString("foobar099"), "foobar100");
assertEquals(incrementString(""), "1");

【讨论】:

  • 这看起来不错@Nina,但我仍处于 JS 之旅的早期阶段。我会看看这个并尝试分解它。感谢您的解决方案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
相关资源
最近更新 更多