前端编程题

74 阅读1分钟

每天两道(2023-6-27)

对象数组去重

描述:根据每个对象的某一个具体属性来进行去重,因为考虑到服务端返回的数据中可能存在id重复的情况,需要前端进行过滤
思路:使用includes方法,使用includes方法的对象是数组,比较的是id,所以需要将新创建的id取出组成一个数组,之后进行对比

 <script>
        const responseList = [
          { id: 1, a: 1 },
          { id: 2, a: 2 },
          { id: 3, a: 3 },
          { id: 1, a: 4 },
        ];
        //创建一个新的数组保存信息
        let newArr=[]
        //使用reduce
        newArr=responseList.reduce((acc,cur)=>{
        let ids=acc.map(item=>item.id);
        return ids.includes(cur.id)?acc:[...acc,cur]
        },[])

        console.log(newArr);
    </script>

手写数组的filter方法

filter方法就是将通过测试的元素放在一个新的数组里面,内部只需要调用传入的函数,就可以得到测试元素

<script>
        /**
         * 实现的功能点:把不符合要求的过滤掉
         * 传入的参数:一个函数,函数应该传入的参数:数组当前正在处理的函数,索引(index),array(数组本身)
         * 函数的返回值:如果测试元素通过,就返回测试元素组成的数组,没有就返回一个空数组
        */
       Array.prototype._filter=function(fn,context){
        //不知道函数在这里怎么处理:直接调用就可以了
        //判断fn是不是一个函数
        if(typeof fn!='function'){
            throw new Error(`${fn}不是一个函数`)
        }
        let arr=this;
        let result=[];
        for(let i=0;i<arr.length;i++){
           let temp= fn.call(context,arr[i],i,arr)
           if(temp){
            result.push(arr[i])
           }
        }
        return result
        
       }
       function isBigEnough(value) {
        return value >= 10;
    }
        const filtered = [12, 5, 8, 130, 44]._filter(isBigEnough);
        console.log(filtered);
        // filtered is [12, 130, 44]
    </script>