BFE.devAI解答 - JavaScript 代码题
3. 实现Array.prototype.flat()
使用递归的方式实现Array.prototype.flat():
function flat(arr, depth = 1) { return depth > 0 ? arr.reduce((acc, val) => Array.isArray(val) ? acc.concat(flat(val, depth - 1)) : acc.concat(val) , []) : arr.slice();}
使用迭代的方式实现Array.prototype.flat():
function flat(arr, depth = 1) { const result = []; const stack = arr.map(val => ({ value: val, depth: 0 })); while (stack.length) { const { value, depth } = stack.pop(); if (Array.isArray(value) && depth < depth) { for (let i = value.length - 1; i >= 0; i--) { stack.push({ value: value[i], depth: depth + 1 }); } } else { result.unshift(value); } } return result;}
其中使用了一个栈来存储当前的值和深度,类似于DFS的迭代写法。每次取出栈顶元素,如果是数组并且深度未达到指定层数,就将子元素依次推入栈中;否则说明已经扁平化到了指定深度,就将当前值加入结果数组中即可。由于需要保持顺序不变,这里使用了unshift()
来在结果数组开头添加元素。