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) 
        ? flatten(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)会将所有嵌套层级的数组都扁平化。

你可能感兴趣的:(前端,前端,javascript,ecmascript,typescript,es6)