> For the complete documentation index, see [llms.txt](https://xiaohesong.gitbook.io/today-i-learn/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://xiaohesong.gitbook.io/today-i-learn/front-end/di-gui-ji-qu-zhong.md).

# 递归及去重

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

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

```javascript
const parseChild = (array, result=[]) => {
  array.forEach(item => {
    result.push(item)
    if(item.children){
      parseChildren(item.children, result)
    }
  })
  return result
}
```

这个就是一个简单的递归,但是现在出现了数据重复的问题,所以得加点代码,如下

```javascript
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`,是不相等的.

```javascript
`NaN === NaN`  // false
`[NaN].indexOf(NaN)` // -1
```

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

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

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