JS--数组-- 扁平化 / 去重

数组扁平化

扁平化就是将嵌套的数组变成一维数组的过程
1.迭代递归

flatten(arr)
function flatten(arr, result = []) {
    for (let item of arr) {
        if (Array.isArray(item)) //item是数组继续迭代
            flatten(item, result)
        else
            result.push(item) //item不是数组插入result中
    }
    return result
}

2.生成器实现

//迭代当前数组,如果值也是数组则生成扁平化的值,否则直接生成值。
function* flat(arr) {
    for (let item of arr) {
        if (Array.isArray(item))
            yield* flat(item)
        else
            yield item
    }
}
//在扁平化函数里调用这个生成器函数得到我们的一维数组。
function flatten(arr) {
    let result = []
    for (let val of flat(arr)) {
        result.push(val)
    }
    return result
}

NOTE

  1. 嵌套 yield 需要再加一个星号,这被称为生成器委托。
  2. 不能使用 forEach 代替 for…of 但可以用 for 循环,因为 for 循环和for…of 可以中断迭代去执行 yield,forEach 不行

3.reduce 三句实现法

function flatten(arr) {
  return arr.reduce((flat, toFlatten) => {
    return flat.concat(Array.isArray(toFlatten) ? flatten(toFlatten) : toFlatten);
  }, []);
}

4.降维打击
转成字符串,之后再复原成数组

function flatten(arr){
    return arr.toString().split(',')
}

数组去重

  1. set数据去重,form转换数组
  • ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
  • Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like
    object)和可遍历(iterable)的对象(包括ES6新增的数据结构Set和Map)。
Array.from(new Set(newArr1))
  1. 数组reduce方法
    利用indexOf判断上一次回调返回数组a中是否包含当前元素b的索引;
    如果不存在,则把b元素加入a数组,否则直接返回a。
var duplicate1 = newArr1.reduce((a, b) => {
  if(a.indexOf(b) === -1) {
    a.push(b)
  }
  return a
}, [])

3.数组下标去重
数组的过滤filter方法,利用indexOf获取当前元素ele在被过滤数组farr中的第一个索引值,如果值与当前索引值index相等则返回,如果不相等则过滤。

var duplicate2 = newArr1.filter((ele, index, farr) => {
  return farr.indexOf(ele) === index
})

4.遍历数组
遍历数组,建立新数组,利用indexOf判断元素是否存在于新数组中,不存在则push到新数组。

var duplicate3 = []
for(var i = 0; i < newArr1.length; i++) {
  if(duplicate3.indexOf(newArr1[i]) === -1) {
    duplicate3.push(newArr1[i])
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值