【问题标题】:Javascript nested for loop and array.reduceJavascript嵌套for循环和array.reduce
【发布时间】:2017-06-13 05:46:39
【问题描述】:

我是编程新手,也是这个网站的新手,我有一个关于嵌套 for 循环的问题。这是代码:

function eddardStarkSecret() {

    var ans =[];
    var map = [
        [111, 1, 6], [110, 2, 5, 22], [115, 10], [83, 4], [119, 7],
        [105, 9], [97, 12, 15, 18], [84, 14], [114, 16, 19],
        [103, 17], [121, 20], [101, 21], [32, 3, 8, 11, 13], [74,0]
    ]; 

    for (var i = 0; i < map.length; i++) {
        for (var j = 1; j < map[i].length; j++) 
            ans[map[i][j]] = map[i][0];

    }   
    return ans.reduce(function (prev, curr) {
        return prev + String.fromCharCode(curr);
    },"");

}

代码的输出是这样的:“Jon Snow is a Targaryen”

现在,我的问题是,它是怎么发生的?我对 array.reduce() 部分的工作原理有一点了解。我真正感到困惑的部分是嵌套 for 循环是如何工作的(比如它如何产生 32 个字符代码(空格键)以及它如何使数组长度为 23 并产生所需输出所需的单词)。

任何帮助将不胜感激。非常非常感谢。

【问题讨论】:

  • 剧透警告!!

标签: javascript arrays for-loop multidimensional-array nested-loops


【解决方案1】:

了解正在发生的事情的最佳方法是在调试器中运行此代码,逐步进行。您的网络浏览器内置了一个功能齐全的调试器,您可以使用它,或者任何 JavaScript IDE 都可以。

但简而言之:

map 数组的子数组中,第一个条目是字符代码,所有后续条目都是应该使用该字符的位置。例如,[111, 1, 6] 告诉我们字符代码 111 ("o") 应该在结果中的位置 1 和 6。

我真正困惑的部分是嵌套 for 循环是如何工作的(比如它是如何产生 32 charcode(空格键)的)

32 是map 数组中倒数第二个条目中的第一个值,即[32, 3, 8, 11, 13],因此它位于位置 3、8、11 和 13。

以及它是如何使数组长度为 23 并产生所需输出所需的单词的)。

通过循环遍历子数组,跳过第一个条目(通过从 1 开始 j 而不是 ),并将所有其他条目用作 ans 的索引,它存储第一个条目的值(字符代码) 在ans:

// The char code vvvvvvvvv
ans[map[i][j]] = map[i][0];
//  ^^^^^^^^^--- where to put it

最后,它只是使用String.fromCharCode 循环遍历ans 以将每个条目转换为其字符并将其附加到与reduce 一起使用的累加器中。

【讨论】:

  • 哇!我现在知道代码是如何工作的。解释很到位!正如该社区的知名成员所期望的那样。非常非常感谢TJ! ^_^
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多