【问题标题】:Determine if one of the elements in an array is a string确定数组中的元素之一是否为字符串
【发布时间】:2017-03-09 15:02:23
【问题描述】:

给定一个混合类型的数组,“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]);

【问题讨论】:

  • 你为什么标记typeof而不使用它?
  • 使用typeOf算子判断类型
  • 我不确定如何使用 typeof。如果 (!typeof arr[i] === "string") return "" 会这样吗?

标签: javascript arrays string element typeof


【解决方案1】:

您可以过滤字符串数组,然后使用 reduce 操作找到最长的一个

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]));

请注意,如果任何单词的长度相同,则返回数组中较早的单词。


此外,您可以跳过 filter 并在 reduce...中进行类型检查...

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

【讨论】:

    【解决方案2】:

    您遍历元素并检查其类型是否为字符串。 您可以使用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];
        }
    }
    

    【讨论】:

      【解决方案3】:

      这是我的版本...

      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]);
      

      【讨论】:

      • 我真的不认为这些是正当的理由。这就像如果你编写草率的代码,for in 循环就会中断。
      • 迭代可枚举继承属性不是主要问题。主要问题是迭代顺序没有明确定义,所以如果有多个长度相同的字符串值,你会得到不一致的结果
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 2015-08-09
      • 1970-01-01
      • 2020-03-12
      • 2014-09-24
      • 2019-10-09
      • 2022-07-30
      相关资源
      最近更新 更多