前端小白初体验回调函数

475 阅读2分钟

题目

编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。

示例 1: 
输入: ["flower","flow","flight"]
输出: "fl"

示例 2: 
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。  

首先看到这道题目我的思路是

  • 如果 实参 数组长度 <= 1 不用比较 直接输出这个实参
  • 用回调函数将数组里面每个字符串的同位置字符进行比较
  • 找出数组里面 字符串 的 最小长度 循环到这里停止
  • 用一个空数组把相同的字符装起来
  • 数组 join 一下变成字符串
  1. 判断传进函数里的数组长度是否大于1,
if (strs.length <= 1) {
    console.log(strs.join('')) //如果小于1, 我就直接把这个数组转换成字符串直接输出
    return
  }

  1. 开始使用回调函数了
  • 传入i, j , 数组
  • 用 map 遍历一下数组 找出数组里面字符串最短的长度
  • 循环,比较每个字符串相同位置的字符是否相同 ( 以 ['flower', 'floor', 'flight', 'fly'] 数组为例 )
function cal (i, j, strs) {
  const strLength = strs.map((ele) => ele.length)
  const minLength = Math.min(...strLength)
  if (j >= minLength) return
  let temp = strs[i][j];

  for (let k = 1; k < strs.length; k++) {
    if (strs[k][j] !== temp) {
      return
    }
  }
  cal(i, j + 1, strs) // 回调函数
  arr.push(temp)
}

第一次循环,将 flower 中的第一个字符 f 与 floor 的第一个字符 f 比较,发现它们相同,第二次循环,再将 floor 的第一个字符 f 和 flight 的第一个字符 f 比较, 发现它们相同,第三次循环...... (下图是回调过程)

回调过程

循环完后, j+1, 意思是接着比较 各字符串里面的 第二个字符,调用回调函数,再接着比较 各字符串里面的 第n个字符 最后,得到的数组 arr

console.log(arr)
=> ['f', 'l']

判断数组是不是是空数组,如果是空数组,按照题目要求,输出'',否则,输出一个字符串

const arrLength = arr.length == 0 ? '' : arr.reverse().join('') 
console.log(arrLength)
=> 'fl'

这样我就用回调函数得到了一个数组,并将这个数组转换成了字符串,完美的符合了题干要求,做完啦 : )

总结

4 + 3

四个步骤写完这个回调函数:

  • 如果 实参 数组长度 <= 1 不用比较 直接输出这个实参
  • 用回调函数将数组里面每个字符串的同位置字符进行比较
  • 找出数组里面 字符串 的 最小长度 循环到这里停止
  • 用一个空数组把相同的字符装起来
  • 数组 join 一下变成字符串

三个方法完善这个回调函数,map、Math.min、...扩展运算符。

小白初体验回调函数,虚心接受更好的建议和反馈!谢谢~