过滤数组中的元素

110 阅读2分钟

前言:锻炼自己的思想,规范自己的编程思路。每天一道算法题,督促自己。

靡不有初,鲜克有终,加油坚持下去。

问题:

请你编写一个函数,该函数接受一个整数数组参数 arr 和一个过滤函数 fn,并返回一个过滤后元素数量较少或元素数量相等的新数组。

返回的数组应该只包含通过过滤函数 fn(arr[i], i) 计算后为真值的元素。

请你在不使用内置函数 Array.filter 的前提下解决该问题。

示例:(放代码里面)

示例1:
输入:arr = [0,10,20,30], fn = function greaterThan10(n) { return n > 10; }
输出: [20,30]
解释:
const newArray = filter(arr, fn); // [20, 30]
过滤函数过滤掉不大于 10 的值

示例2:
输入:arr = [-2,-1,0,1,2], fn = function plusOne(n) { return n + 1 }
输出:[-2,0,1,2]
解释:
像 0 这样的假值应被过滤掉

思路:看到这个题目,我想的是在函数要求下,循环数组,判断数组中的值是否满足函数条件,返回数组。

所以,声明一个数组newArr,for循环遍历数组,if条件判断 传入的fn函数 满足要求的数组值,传入数组值arr[i],且要传入i(其实我一开始没有传入,结果执行总是错误),将满足条件的arr[i]值,push进新申明的数组。

基于上述思考,代码如下:

for循环版:

/**
 * @param {number[]} arr
 * @param {Function} fn
 * @return {number[]}
 */
var filter = function(arr, fn) {
    let newArr = []
   for(let i = 0;i<arr.length;i++){
       if(fn(arr[i],i))
          newArr.push(arr[i])
   }
   return newArr
};

foreach循环版本:

var filter = function(arr, fn) {
    let newArr = []
   arr.forEach((n,i)=>{
       if(fn(item,i)) newArr.push(item)
   })
   return newArr
};

执行效果如图:

image-20230429225652442.png

结论:

今日学习:

  1. 数组常用方法:arr.push() 在数组末尾添加数值 arr.pop() 将数组末尾的值删除

  2. foreach循环:按顺序从数组的第一个元素遍历到最后一个元素

    foreach 循环语句是 for 语句的特殊简化版本,主要用于执行遍历功能的循环。

    foreach(item,i) item不是循环变量,它保存数组中的元素,foreach将数组中的元素取出来,并保存到item中,这个过程不需要循环变量,通过数组下标访问数组中的元素。

    😁以前就知道foreach了,可能是对未知知识学习的无力感,且现有的for循环也可以用,就一直没有真正用过,今天学习了啦,之后要常用,然后这个知识点就是我啦。