在Javascript中的深层平面多维数组

13 浏览
0 Comments

在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日
0
0 Comments

你的代码大部分都没问题。 .concat 返回一个新数组,它不会修改原始数组。如果你将

result.concat(deepFlatten(elem)); // problem probably lies here

改为:

result = result.concat(deepFlatten(elem)); // problem probably lies here

我认为它会得到正确的结果。

0
0 Comments

你只需要把结果设置为 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]]]))

0