[JS基础] (数组类)算法题

435 阅读2分钟

目录

  1. 通过 filter 去除Array中的 undefined null 空字符串
  2. filter 的实现
  3. 返回数组中符合指定规则第一个元素
  4. 倒序打印链表的值
  5. 找出下列正数组的最大差值

一 通过 filter 去除Array中的 undefined null 空字符串

filter()方法会 创建一个新数组,原数组的每个元素传入回调函数中,回调函数中有return返回值,若返回值为true,这个元素保存到新数组中;若返回值为false,则该元素不保存到新数组中;原数组不发生改变`

使用场景,过滤接口返回的数据

var arr1 = ['A', '', 'B', null, undefined, 'C', '  ',""];
 function removeInvalid(arr){
    return arr.filter(function (item) {
        return item && item.trim();
    });
 }
removeInvalid(arr1)
// ['A', 'B', 'C']

filter 的实现

1) filter 的使用

filter用于对数组进行过滤。 它创建一个新数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。

Array.filter(function(currentValue, indedx, arr), thisValue)

thisValue 指定 this 的作用域对象

1) filter 的实现

基于 for + if + call 实现

Array.prototype.filter1 = function filter1(fn, context) {
  if (typeof fn !== "function") {
    throw new TypeError(`${fn} is not a function`);
  }
  
  let arr = this;
  let temp = [];
  for (let i = 0; i < arr.length; i++) {
     let result = fn.call(context, arr[i], i, arr);
     if (result) temp.push(arr[i]);
  }
  return temp;
};
var arr =[1,2,1,6,2,3];
var arr1 = arr.filter1((item, index, self) => self.indexOf(item) === index)
console.log(arr1); 
// [1, 2, 6, 3]

三 返回数组中符合指定规则第一个元素

入参 一个数组,一个函数, 返回 符合指定规则第一个元素

如:

find([1, 3, 5, 8, 9, 10], function(num) { return num % 2 === 0; }) 应该返回 8find([1, 3, 5, 9], function(num) { return num % 2 === 0; }) 应该返回undefined

实现

function find(arr,fn){
    let newArr = arr.filter(fn);
    console.log(newArr);
    return newArr[0];// filter 返回一个新的符合条件的数组, 取其第一个元素即可.如果 filter 返回为空数组,则取不到返回 undefined
}
var arr1 = [1, 3, 5, 8, 9, 10];
var fn = (item) => item % 2 ===0;
find(arr1,fn);// 8

四 倒序打印链表的值

题目说明: 不能使用临时变量 var temp = x;

递归在调用自身之后打印即是倒序,在调用自身之前打印就是正序

var node = {
            val:1,
            next:{
                val:2,
                next:{
                    val:3,
                    next:{
                        val:4
                    }
                }
            }
        }

        function reverseFun(node){
            if(!node){
                return
            }else{
                console.log('before:',node.val)
                reverseFun(node.next)
                console.log('after:',node.val)
            }
        }

        reverseFun(node);
// before: 1
// before: 2
// before: 3
// before: 4

// after: 4
// after: 3
// after: 2
// after: 1

五 找出下列正数组的最大差值

比如: 输入 [10,5,11,7,8,9] 输出 6

这是通过一道题目去测试对于基本的数组的最大值的查找,很明显我们知道,最大差值肯定是一个数组中最大值与最小值的差


        var arr1 = [16,5,1,7,22,9]

        function getMaxDifferenceValue(arr) {

            const item1 = Math.max.apply( null, arr );

            const item2 = Math.min.apply( null, arr );

            return item1 - item2;

        }

console.log(getMaxDifferenceValue(arr1)); // 21

ES6实现

 var arr1 = [16,5,3,7,22,9]

        function getMaxDifferenceValue(arr) {

            const item1 = Math.max(...arr);

            const item2 = Math.min(...arr);

            return item1 - item2;

        }

        console.log(getMaxDifferenceValue(arr1)); // 19

总结

  • filter : arr ---过滤筛选--> arr 不改变原始数组, 返回一个符合条件的新数组.
  • map : arr ---加工处理--> arr 不改变原始数组, 返回一个新数组.