递归及去重
之前写了个递归,但是后台返回数据的原因,会导致出现重复的数据.还好,递归的方法是个共有的方法,不用改太多的东西.
之前的返回数据的递归是这样的.
const parseChild = (array, result=[]) => {
array.forEach(item => {
result.push(item)
if(item.children){
parseChildren(item.children, result)
}
})
return result
}这个就是一个简单的递归,但是现在出现了数据重复的问题,所以得加点代码,如下
export const parseChildren = (array, result=[], ids=[]) => {
array.forEach(item => {
if(!ids.includes(item.id)){
ids.push(item.id)
result.push(item)
}
if(item.children){
parseChildren(item.children, result, ids)
}
})
return result
}可以发现,也就是在push的时候加上了判断,判断是否push过这个item,没有就再push.
有心人会发现,判断重复是通过includes来处理的.includes采用的是SameValueZero策略来判断相等的.可以满足绝大多数场景
includes和===的区别就是对应NaN的判断.
严格相等(Strict Equality Comparison)判断的NaN,是不相等的.
`NaN === NaN` // false
`[NaN].indexOf(NaN)` // -1indexOf判断的策略也是Strict Equality Comparison,所以这里返回了-1
但是includes却是可以的. [NaN].includes(NaN) //true.
类似includes的这种策略(SameValueZero)的还有Map, Set等.
Last updated