递归及去重

之前写了个递归,但是后台返回数据的原因,会导致出现重复的数据.还好,递归的方法是个共有的方法,不用改太多的东西.

之前的返回数据的递归是这样的.

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)` // -1

indexOf判断的策略也是Strict Equality Comparison,所以这里返回了-1

但是includes却是可以的. [NaN].includes(NaN) //true.

类似includes的这种策略(SameValueZero)的还有Map, Set等.

Last updated