javascript - 用堆栈展平数组
问题描述
我正在尝试使用堆栈迭代地展平数组(或者在此示例中拼接结果数组而不是从堆栈中添加/删除)直到特定深度(除了学习之外没有任何实际原因)。
到目前为止我有
function flatten(arr, depth = 1) {
let flat = [];
let i = 0;
let d = depth;
for (let elem of arr) {
flat.push(elem);
d = depth;
while(i < flat.length) {
if (Array.isArray(flat[i]) && d !== 0) {
flat.splice(i, 1, ...flat[i]);
d--;
} else {
i++;
}
}
}
return flat;
}
但是如果我有一个诸如 [[3], 4, [5, [6]] 之类的级别,它就会倒下,因为一旦它进入“3”的深度,它就不会退出。
我可以做一个简单的修改吗?
我使用的原始数组是flatten([[1],2,[[3], 'ddd', [4,[5]]]], 2)
,我希望结果是 [1,2,3,'ddd',4, [5]]
如果我通常使用堆栈实现它,我也会遇到同样的问题。
解决方案
我认为你可以用一种非常干净的方式完成它concat
:reduce
const flatten = (array, depth) => {
if(!depth) return array;
while(depth > 0) {
array = array.reduce((pre, curr) => pre.concat(curr), []);
depth--;
}
return array;
}
const flat = flatten([1, 2, ['a', 3], [4, [6, 4]], 3, [1, 3], [[['a', 2], 2, 'b'], 'c', 3], 4], 2);
console.log(flat)
基本上它所做的是遍历数组depth
时间。每次传递都会将reduce
数组传递到另一个数组,该数组是concat
前一个数组中每个元素的。要点是concat
有两种不同的可能调用:
- 当使用非数组参数调用时,它只是将元素添加到原始数组
- 当使用数组参数调用时,它将给定数组的每个元素添加到原始元素
所以基本上“扁平化”的核心已经concat
自己完成了,你只需要继续这样做depth
。
推荐阅读
- database - 如何修改liquibase中sql脚本的默认执行顺序?
- python - pythonic方法来计算多列有条件检查
- c++ - 找不到“assimp/config.h”,但它在文件夹中
- java - 需要更改 Spring Cloud 中的引导程序环境
- php - 如何在 Windows 上的 Eclipse 中安装 PHP Xdebug?
- python-3.x - AttributeError:“列表”对象没有属性“超时”
- node.js - 更新 formik.values 时需要 Formik 奇数 (.value)
- python - SQLAlchemy 从 JSON 列表插入数据库
- python - 使用 Python 使用一个时间序列来预测另一个(不均匀间隔)
- c - 为什么函数局部变量和参数被推入堆栈?