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