在Javascript中的深层平面多维数组
在Javascript中的深层平面多维数组
这个问题已经有了答案:
我想写一个可以深度展平给定数组的函数。例如:
deepFlatten([]); // [] deepFlatten([1, 2, 3]); // [1, 2, 3] deepFlatten([[1, 2, 3], ["a", "b", "c"], [1, 2, 3]]); // [1, 2, 3, "a", "b", "c", 1, 2, 3] deepFlatten([[3], [4], [5]], [9], [9], [8], [[1, 2, 3]]]); // [3, 4, 5, 9, 9, 8, 1, 2, 3]
我试图递归解决这个问题,到目前为止我写出来的代码如下:
var deepFlatten = function (array){ var result = []; array.forEach(function (elem) { if (Array.isArray(elem)) { result.concat(deepFlatten(elem)); // problem probably lies here } else { result.push(elem); } }); return result; };
然而,它只将非数组元素推入结果中,并完全忽略了连接部分。我该如何解决这个问题,或者是否有更好的方法来编写这个函数,而不需要使用任何外部库?
admin 更改状态以发布 2023年5月22日
你只需要把结果设置为 result = result.concat(deepFlatten(elem))
var deepFlatten = function (array){ var result = []; array.forEach(function (elem) { if (Array.isArray(elem)) { result = result.concat(deepFlatten(elem)); // Fix here } else { result.push(elem); } }); return result; }; console.log(deepFlatten([])) console.log(deepFlatten([1, 2, 3])) console.log(deepFlatten([[1, 2, 3], ["a", "b", "c"], [1, 2, 3]])) console.log(deepFlatten([[[3], [4], [5]], [9], [9], [8], [[1, 2, 3]]]))
或者你可以使用 reduce()
和扩展语法代替 concat。
var deepFlatten = function (array){ return array.reduce(function(r, e) { return Array.isArray(e) ? r.push(...deepFlatten(e)) : r.push(e), r }, []) }; console.log(deepFlatten([])) console.log(deepFlatten([1, 2, 3])) console.log(deepFlatten([[1, 2, 3], ["a", "b", "c"], [1, 2, 3]])) console.log(deepFlatten([[[3], [4], [5]], [9], [9], [8], [[1, 2, 3]]]))