2017-01-13 124 views
2

您好我發現了一個代碼的問題的解決方案,我不知道什麼是一個語法。該函數接受一串字符,並根據長度以特定方式返回它。Javascript:這個`Array(i + 1)`做什麼?

input =「abcd」; output =「A-Bb-Ccc-Dddd」 input =「gFkLM」;輸出= 「G-FF-KKK-LLLL-MMMMM」

這傢伙張貼了這個解決方案

function accum(str) { 
    var letters = str.split(''); 
    var result = []; 
    for (var i = 0; i < letters.length; i++) { 
    result.push(letters[i].toUpperCase() + Array(i + 1).join(letters[i].toLowerCase())); 
    } 
    return result.join('-'); 
} 

有點兒困惑的整體解決方案,但有一點是特別嘮叨我。看到Array(i + 1)?這是做什麼的?對不起,谷歌不是一件容易的事情。

+1

陣列(N)產生長度的數組'N' –

+0

酷特技。泰! –

+1

有時候這些用於面試問題,面試官想看看面試者如何思考以及他們在被困時做什麼。他們想知道一個人是否因爲某個問題而生氣,或者如果他們被困住並願意尋求幫助,他們可以。 – Clomp

回答

6

我認爲這分配了一個長度爲i + 1的數組。但更重要的是,代碼在做什麼?你必須知道join()函數的作用是什麼......它連接由函數參數分隔的數組中的元素。例如:

['one', 'two', 'three'].join(' ') === 'one two three' 

在這種情況下,數組充滿undefined元素,所以你得到的東西是這樣的:在0

[undefined].join('a') === '' 
[undefined, undefined].join('b') === 'b' 
[undefined, undefined, undefined].join('c') === 'cc' 
[undefined, undefined, undefined, undefined].join('d') === 'ddd' 
+0

感謝這非常有幫助 - 我現在瞭解所有的代碼。多麼有創意的解決方案 –

+0

沒問題!讀完@ RafiqueAhmed的回答後,我意識到數組是用'undefined'元素而不是'null'元素初始化的,並且已經更新了我的答案以反映這一點。 – dana

+0

upvoted for undefined magic:P –

1

所以在一開始的說法,我開始了現在如果你在for語句裏面說i + 1,我會是1.然後當for循環更新並且i等於1時,for循環中的i + 1將等於2.這個過程會持續到字符串。希望這可以幫助。

1

我剛檢查

let x= Array(3); 
console.log(x); 

的輸出是[未定義,未定義未定義]

因此它實際上與所有元素爲未定義創建尺寸3的陣列。 當我們用一個字符作爲參數調用連接時,它會創建一個字符串,它具有相同的字符,重複2次,即(3-1)。

console.log(x.join('a')); // logs aa 
0

註釋的代碼步行雖然....

function accum(str) { 
    /* converts string to character array.*/ 
    var letters = str.split(''); 
    /* variable to store result */ 
    var result = []; 
    /* for each character concat (1.) + (2.) and push into results. 
     1. letters[i].toUpperCase() : 
      UPPER-CASE of the character. 
     2. Array(i + 1).join(letters[i].toLowerCase()) : 
      create an array with EMPTY SLOTS of length that is, +1 than the current index. 
      And join them to string with the current charater's LOWER-CASE as the separator. 

      Ex: 
      Index | ArrayLength, Array  | Separator | Joined String 
      0   1, [null]     'a'    '' 
      1   2, [null,null]    'b'    'b' 
      2   3, [null,null,null]   'c'    'cc' 
      3   4, [null,null,null,null] 'd'    'ddd' 

      NOTE: 
      Join on an array with EMPTY SLOTS, inserts the seperator inbetween the slot values. 
      Meaning, if N is the length of array. Then there will be N-1 seperators inserted into the joined string 

    */ 
    for (var i = 0; i < letters.length; i++) { 
     result.push(letters[i].toUpperCase() + Array(i + 1).join(letters[i].toLowerCase())); 
    } 

    /* finally join all sperated by '-' and return ...*/ 
    return result.join('-'); 
}