【问题标题】:For loop and 2 arraysFor循环和2个数组
【发布时间】:2018-11-26 20:24:23
【问题描述】:

我正在学习 Javascript,但我对 for 循环感到困惑。我不知道如何遍历 2 个数组并从每个连接在一起的数组中打印一个值。我尝试解决以下问题,但它不起作用。解决这个问题的最佳方法是什么。谢谢你的帮助!

var nums = [1, 5, 88, 2, 5, 42, 57, 101]
var nouns = ["ducks", "telephone booth", "the enterprise", "robots", "amazon", "eraser", "zafod", "a"]

// output of the first function should be: "1 ducks"
for (let i=0; i.nums.length; i++)
    console.log(nums[i].concat(nouns[i]));

【问题讨论】:

    标签: javascript arrays loops for-loop concat


    【解决方案1】:

    For循环条件

    您的 for 循环条件导致错误。 syntax of a for loop 声明第二项(“循环条件”)应计算为布尔值(true/false),告诉您何时继续迭代以及何时停止。

    现在您将“i.nums.length”作为循环条件,这不是有效代码(因为存储在变量i 中的数字没有属性nums)。

    相反,您应该将i < nums.length 作为循环条件,这将是true,直到i 不再是nums 数组中的有效索引,此时它是false 和循环停下来。

    连接输出

    数字没有“concat”方法,所以不能使用nums[i].concat()。要在javascript中将数字与字符串连接,可以使用+,它将数字转换为字符串并将其连接到字符串。如果你想要一个空间,你也可以连接它。

    检查长度

    如果nouns.length小于nums.length,Javascript会为nouns的缺失项生成undefined,但不会抛出错误。为了确保两个数组在迭代它们之前的长度相同,如果长度不完全匹配,您可以使用console.assert(nouns.length === nums.length, message) 打印错误消息。这不是严格要求的(因为您的示例代码中的长度 do 匹配),但可以使代码对数组声明中的错误更加健壮。

    最终代码

    最终代码(包含所有修改)如下所示:

    var nums = [1, 5, 88, 2, 5, 42, 57, 101];
    var nouns = ["ducks", "telephone booth", "the enterprise", "robots", "amazon", "eraser", "zafod", "a"];
    console.assert(nums.length === nouns.length, `Array sizes ${nums.length} and ${nouns.length} don't match`);
    
    // output of the first function should be: "1 ducks"
    for (let i = 0; i < nums.length; i++) {
        console.log(nums[i] + " " + nouns[i]);
    }
    

    【讨论】:

    • 您应该检查两个数组的大小是否相同,以避免意外错误。将 for 循环括在 if 语句中 if (nums.length === nouns.length) {...}
    • 我添加了一个断言来检查长度是否匹配。我不确定将循环包含在 if 语句中是避免此类错误的最佳方法,因为它用另一个(根本不打印任何内容)替换了一个静默失败(打印undefineds),但它确实包括支票似乎是合理的。
    【解决方案2】:

    您的代码中有多个错误。

    i.nums.length 应该是i &lt; nums.length

    concat 仅适用于字符串,因此首先您需要将nums[i] 值转换为字符串,然后使用str1.concat(str2) 或者您可以在nums[i]nouns[i] 之间简单地使用+,这是一种更简单的方法像这样:nums[i] + " " + nouns[i]

    下面是工作代码,看看:

    var nums = [1, 5, 88, 2, 5, 42, 57, 101]
    var nouns = ["ducks", "telephone booth", "the enterprise", "robots", "amazon", "eraser", "zafod", "a"]
    
    // output of the first function should be: "1 ducks"
    for (let i = 0; i < nums.length; i++) {
      console.log(nums[i] + " " + nouns[i]);
    }

    【讨论】:

    • 正如评论中所说,“1鸭子”而不是“1鸭子”,我相信你错过了一个空间,toString是不必要的,因为需要额外的空间
    • @Isaac 感谢您指出“1 只鸭子”而不是“1 只鸭子”,但toString() 是必需的。因为这里的目的不仅仅是为用户提供任何替代解决方案,而是在他使用的任何东西中为他提供正确的解决方案。我已经解释了为什么concat 不起作用,然后提到了如何使它起作用。希望它有意义。
    • 我的意思是,因为我们需要在 1 和鸭子之间有一个空格,因此我们可以应用类型强制,就像Ollin Boer Bohan 中的答案一样。我并不是说这是错误的,只是不必要的,或者只是喜欢风格
    • @Isaac 好吧。知道了。更新。请看一看!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多