2017-06-22 59 views
2

我正在寫一個函數,它返回給定數組中的最長字符串。如果數組爲空,它應該返回一個空字符串(「」)。如果該數組不包含任何字符串;它應該返回一個空字符串。獲取最長的字 - JS

function longestWord(arr) { 
var filtered = arr.filter(function(el) { return typeof el == 'number' }); 
    if (filtered.length > 0) { 
    return Math.min.apply(Math, filtered); 
    } else { 
    return 0; 
    } 
} 

var output = longestWord([3, 'word', 5, 'up', 3, 1]); 
console.log(output); // --> must be 'word' 

現在我的代碼不會拉字,而是拉出數字。任何想法我錯過了什麼?

+2

'typeof el =='string''? 'Array.prototype.filter()'返回數組**中符合條件**的所有元素。在你的情況下,你的意思是「我想匹配'typeof'等於'number'的所有元素,但是你想要的是匹配'string'類型的元素。 –

+1

使用數組reduce可能是一個更好的解決方案 - 同樣,單詞永遠不會是答案,因爲您只查看不是字符串的元素 –

回答

2

讓我們來看看你的代碼。

longestWord函數的第一行:

var filtered = arr.filter(function(el) { return typeof el == 'number' }); 

將篩選基於typeof el === 'number'輸入數組,這將返回一個包含只輸入數組其是type of === number的元素的數組。

既然目標是找到最長的單詞,這也許應該改爲:

var filtered = arr.filter(function(el) { return typeof el === 'string' }); 

將輸入數組中返回一個字符串數組。

接下來,檢查過濾的數組是否爲空。如果數組爲空,則返回0。你的指令說如果數組是空的,或者數組不包含字符串,它應該返回一個空字符串。因此,我們應該將其更改爲:

return ""; 

如果數組不爲空,或者包含字符串,返回Math.min.apply(Math, filtered)。這個語句會返回一個數組的最小值,所以可能不是你想要的。畢竟,目標是返回最長的字符串。

要做到這一點,我們可以使用多種方法,這裏有一個:

filtered.reduce(function(a, b) { return a.length > b.length ? a : b }) 

該語句使用reduce()方法步驟通過數組並返回最長的項目。

把所有我們相聚:

function longestWord(arr) { 
 
    var filtered = arr.filter(function(el) { return typeof el === 'string' }); 
 
    if (filtered.length > 0) { 
 
    return filtered.reduce(function(a, b) { return a.length >= b.length ? a : b }); 
 
    } else { 
 
    return ""; 
 
    } 
 
} 
 

 
console.log(longestWord([3, 'word', 5, 'up', 3, 'testing', 1])); 
 
console.log(longestWord([])); 
 
console.log(longestWord([1, 2, 3, 4, 5])) 
 
console.log(longestWord(['some', 'long', 'four', 'char', 'strs']))

+0

它必須返回最長的字符串當有領帶時首先出現的陣列 –

+1

這是對上述解決方案的簡單修正。我們已經把他們中的大部分都帶到了這裏,並且在這裏幫助你學習,但是不會爲你做你的工作:) –

+0

你能解決它嗎@JamesHedegon? –

1

我以爲意爲「串」過濾器

一旦你的過濾陣列,你可以簡單地使用減少,以獲得最長的單詞

function longestWord(arr) { 
 
    return Array.isArray(arr) ? 
 
     arr 
 
     .filter(el => typeof el == 'string') 
 
     .reduce((a,b) => b.length > a.length ? b : a) : ''; 
 
} 
 
console.log(longestWord([3, 'word', 5, 'up', 3, 1, 'blah']));

更短的代碼

var longestWord = (arr) => Array.isArray(arr) ? arr.reduce((a,b) => (typeof b == 'string' && b.length > a.length) ? b : a, '') : ''; 
+0

它必須返回數組中最長的字符串,當存在關係時首先出現 –

+0

此代碼可以(編輯)也是這樣,「甚至更短的代碼」已經做到了這一點:p –

0
const longestWord = arr => 
    arr.reduce((result, str) => 
    typeof str == 'string' && result.length < str.length 
     ? str 
     : result, '') 
+0

它必須返回數組中最長的字符串,當存在關係時首先出現 –

+0

@JamesHedegon修復 –

0

這還不是最高效的代碼。爲此,尋求其他的答案,尤其是那些使用reduce,然而,我覺得它更容易閱讀,因而更易於維護:

function longestWord(arr) { 
 
    var filtered = arr.filter(el => typeof el === 'string') 
 
        .sort((a,b) => a.length > b.length ? -1 : 1); 
 
    if (filtered.length) 
 
    return filtered[0]; 
 
    return null; 
 
} 
 

 
var output = longestWord([3, 'word', 5, 'up', 3, 1]); 
 
console.log(output); // --> must be 'word'

但是,當兩個字符串的長度相同做?

+0

它必須返回數組中最長的字符串 –

0

正如所有其他答案都使用filter(),reduce()以及所有那些新穎而又奇特的方法,我會用自己動手的方法(即舊式的方式)來回答。

function longestWord(arr) { 
    if (! (typeof arr === 'array')) { 
     console.log("That's not an array!"); 
     return ''; 
    } 

    var longest = ''; // By default, the longest word is the empty string 

    // Linear search 
    for (var i = 0, length = arr.length; i < length; i++) { 
     var el = arr[i]; 
     if (typeof el === 'string' && el.length > longest.length) { 
      // Words STRICTLY GREATER than the last found word. 
      // This way, only the first word (if two lengths match) will be considered. 
      longest = el; 
     } 
    } 

    return longest; 
} 

我知道,這可能是你想要什麼,因爲你已經在使用filtered(),但它的作品。