JS flat手写实现与对象进行flat

前言

   flat()是ES2019引入的特性,是 JavaScript 数组的一个方法,用于将多维数组扁平化为一维数组。该方法可以接收一个可选的参数 depth,用于指定要扁平化的嵌套层数。默认情况下,它只会将数组降维一层。如果传递的参数大于 0,则会按照指定的层数进行扁平化。如果传递的参数是 Infinity,则会完全扁平化所有嵌套层级。

使用

        以下是对 flat() 方法的使用示例:

const arr = [1, 2, [3, 4, [5, 6]]];

const flattened = arr.flat();
console.log(flattened);
// 输出:[1, 2, 3, 4, [5, 6]]

const deeplyFlattened = arr.flat(2);
console.log(deeplyFlattened);
// 输出:[1, 2, 3, 4, 5, 6]

const fullyFlattened = arr.flat(Infinity);
console.log(fullyFlattened);
// 输出:[1, 2, 3, 4, 5, 6]

        需要注意的是,flat() 方法会自动跳过数组中的空槽位(例如,被删除或从未赋值的元素)。它还会保留原数组中的非数组元素、字符串键和 symbol 键。

手写实现

        递归实现

const myFlat = (arr, n) => {
  if (n === 0) {
    return arr
  }
  const res = myFlat(arr, n - 1)
  return [].concat(...res)
};

        这段代码中,因为每次递归调用都要生成一个新的数组,并通过 concat() 方法将结果数组连接起来。由于每次递归都会生成新的数组对象,造成了频繁的内存分配和垃圾回收,可能导致性能下降。

        而下面这段代码使用了 reduce() 方法和条件判断,在遍历数组的过程中直接判断当前元素是否是数组类型。对于数组类型的元素,通过递归调用 myFlat() 方法进行扁平化;对于非数组类型的元素,直接将其添加到结果数组中。这种实现方式避免了频繁的数组拼接操作,减少了内存分配和垃圾回收的开销,因此性能可能更好。

const myFlat = (arr, n) => {
    if (n === 0)  return arr 
    return arr.reduce((prev, curr) => {
        if (Object.prototype.toString.call(curr) === '[object Array]') {
            prev.push(...myFlat(curr, n - 1))
        } else {
            prev.push(curr)
        }
        return prev
    }, [])
};

        reduce与contact搭配

function myFlat (list, depth = 1) {  
    if (depth === 0) return list  
    return list.reduce((a, b) => a.concat(Array.isArray(b) 
        ? myFlat(b, depth - 1) 
        : b), 
    [])
}

对象使用

        因为"flat"不是 JavaScript 对象的原生方法,而是数组的原生方法。它用于将多维数组扁平化为一维数组。如果想将一个对象进行降维,可以使用Object.entries()Array.flat()方法结合起来实现。

        以下是一个示例:

const obj = {
  a: 1,
  b: {
    c: 2,
    d: 3
  },
  e: 4
};

const flattened = Object.entries(obj).flat()
console.log(flattened)
// 输出 ["a", 1, "b", { c: 2, d: 3 }, "e", 4]

        在这个示例中,Object.entries(obj)将对象转换为包含键值对的二维数组。然后,我们调用flat()将二维数组扁平化为一维数组。最后,输出了一维数组flattened

        PS.flat()方法默认只会将数组扁平化到一层,如果需要完全扁平化多层嵌套的对象,可以给flat()方法传递一个参数,表示要扁平化的层数。

        例如,使用flat(Infinity)会将所有嵌套层级的数组都扁平化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leviash

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值