2016-10-27 5 views
0

Учитывая массив смешанных типов, «getLongestWordOfMixedElements» возвращает самую длинную строку в заданном массиве.Определить, является ли один из элементов массива строкой

Примечания:

  • Если массив пуст, он должен возвращать пустую строку ("").
  • Если в массиве нет строк; он должен вернуть пустую строку.

Как я могу узнать, если массив содержит строку или нет, так как в этом коде:

function getLongestWordOfMixedElements(arr) { 

    if (arr.length === 0) return "" 
    var max = 0 
    for (var i = 0; i < arr.length; i++){ 
     if(arr[i].length > max) max = arr[i] 
    } 
    return max 
} 

getLongestWordOfMixedElements([3, 'word', 5, 'up', 3, 1]); 
+6

Почему вы отметили [tag: typeof] и не используете его? – Phil

+0

[typeof] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof)? – bansi

+0

использование ** типOf ** оператор для определения типа –

ответ

4

Вы можете фильтр массив строк затем использовать уменьшить операцию, чтобы найти самый длинный один

function getLongestWordOfMixedElements(arr) { 
 
    return arr 
 
    .filter(item => typeof item === 'string') 
 
    .reduce((longest, str) => str.length > longest.length ? str : longest, ''); 
 
} 
 

 
console.log(getLongestWordOfMixedElements([3, 'word', 5, 'up', 3, 1]));


Обратите внимание, что если слова имеют одинаковую длину, возвращается более ранняя в массиве.


Кроме того, вы можете пропустить фильтр и сделать проверку типа в уменьшить ...

return arr.reduce((longest, str) => { 
    return typeof str === 'string' && str.length > longest.length ? 
    str : longest; 
}, '') 
0

Вы итерацию по элементу и проверить, если его тип является строкой. Вы можете сделать это с помощью typeof.

Допустим, ты бы кучу данных и не хотели бы, чтобы удвоить использование памяти/или ради примера в коде:

function getLongestWordOfMixedElements(arr) { 
 
    var max = ""; 
 

 
    if (arr.length) { 
 
     arr.forEach(function (item) { 
 
      if (typeof item === "string" && item.length > max) { 
 
       max = item; 
 
      } 
 
     }); 
 
    } 
 

 
    return max; 
 
} 
 

 

 
console.log(getLongestWordOfMixedElements([3, 'word', 5, 'up', 3, 1, {foo:4}]));

В ваш код вы бы изменить его таким образом:

for (var i = 0; i < arr.length; i++) { 
    var item = arr[i]; 

    if (typeof item === "string" && item.length > max) { 
     max = arr[i]; 
    } 
} 
0

Ну вот моя версия этого ...

function getLongestWordOfMixedElements(arr) { 
    let result = ''; 

    if (arr.length) { 
    for(i in arr) { 
     const value = arr[i]; 

     if (value && typeof value === 'string' && value.length > result.length) { 
     result = value; 
     } 
    } 
    } 

    return result; 
} 


getLongestWordOfMixedElements([333333, 'word', 5, 'up', 3, 1]); 
+1

[Почему использование «for ... in» с итерацией массива плохая идея?] (Http://stackoverflow.com/q/500504/1529630) – Oriol

+0

Я действительно не вижу в этом веских причин. Это похоже на то, что вы делаете неаккуратный код, цикл for in будет прерываться. – user3379669

+0

Итерирование перечислимых унаследованных свойств не является основной проблемой. Основная проблема заключается в том, что порядок итераций не является корректным, поэтому, если существует несколько значений строк с одинаковой длиной, вы можете получить непоследовательные результаты – Oriol