Javascript嵌套for循环和array.reduce

时间:2017-01-27 14:02:50

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

我是编程的新手,也是本网站的新手,我对嵌套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是Targaryen”

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

非常感谢任何帮助。很多,非常感谢提前。

1 个答案:

答案 0 :(得分:5)

理解发生了什么的最好方法是在调试器中运行此代码,逐步完成它。您的Web浏览器内置了一个功能齐全的调试器,您可以使用它或任何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

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