2

目前這樣做的挑戰:https://www.codewars.com/kata/shortest-word/train/javascript爲什麼在reduce函數中返回局部變量的長度會引發錯誤?

查找字符串中最短的單詞長度。

這工作:

function findShort(s){ 
    return s.split(' ').reduce((a, b) => b.length < a.length ? b : a).length; 
} 

但這並不:

function findShort(s){ 
    return s.split(' ').reduce((a, b) => b.length < a.length ? b.length : a.length); 
} 

任何想法,爲什麼我不能返回的長度或b即使它們應該是字符串?我清楚地缺少的東西在這裏...

感謝

+0

你不需要編寫自己的邏輯來找到列表的最小值--Math.min已經做到了。嘗試'Math.min(... s.split('').map(({length})=> length)'。 – 2017-01-22 17:03:21

回答

2

.reduce()回調的返回值是真實先後通過回調的每次調用值。如果回調的第一次迭代僅返回.length值,那麼號碼將被傳遞到第二次迭代。當發生這種情況時,您的代碼將嘗試在數字上找到一個.length屬性,該數字不會存在,並且最終會處理undefined值。

因此,在代碼的第一個(工作)版本中,首先調用回調,a是分割字符串的第一個字,b是第二個。它返回ab。然後再次調用回調,第一次調用的結果爲a,第三個字爲b。重複該過程直到最後一個字被傳遞爲b並返回最後一個字符串。然後,.reduce()完成後,代碼抓取該最短字符串的.length

在第二個(非工作)版本中,第一個調用與在工作版本中一樣,第一個單詞爲a,第二個單詞爲b。回調將返回較短單詞的長度。因此,在第二次調用回調時,a是一個數字(以前返回的較短長度),b是第三個詞。訪問a.length將爲undefined,因此比較結果爲false,該功能將返回a.length,即undefined。在第三次調用回調時,a因此將爲undefined,並且嘗試訪問a.length將引發異常。

+0

謝謝,現在有道理!我太專注於.length了。首先減少作品。 – Nymik

0

另一種解決方案是將字符串數組轉換第一個數字數組,所以減少操作可以在數字只是操作:

s.split(' ').map(x => x.length).reduce((a, b) => b < a ? b : a); 
+0

好計劃,蝙蝠俠! – Nymik

相關問題