每天两道(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>