javascript - Javascript 中的深平面多维数组

标签 javascript recursion multidimensional-array concatenation flatten

<分区>

我想编写一个可以深度压平给定数组的函数。例如:

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;
};

然而,这只会将非数组元素推送到结果中,并完全忽略连接部分。我该如何解决这个问题,或者是否有更好的方法在没有任何外部库帮助的情况下编写这个函数?

最佳答案

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

关于javascript - Javascript 中的深平面多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45218858/

相关文章:

javascript - 如何传递 Angular2 组件的格式选项?

javascript - 查找已点击标签上最近的图像

java - 等待上一个函数执行完毕

java - 任何人都可以想出一种方法来打印此模式而不在方法之外存储数据吗?

javascript - 限制递归函数for循环内的变量范围

php - 带有数组字段的准备语句 PostgreSQL&PHP

javascript - Node js错误[ERR_HTTP_HEADERS_SENT] : Cannot set headers after they are sent to the client and no javascript object in console

java - 将数组中的元素移动到空位置

PHP - 对 3 级多维数组进行排序 - 根据第 3 级值排序但在第一级排序

javascript - jQuery 动画 marginRight 不起作用,但 marginLeft 工作得很好