javascript - 递归地展平数组

标签 javascript recursion

我尝试递归地实现数组展平函数。这是代码:

function flatten(arr) {
  var flatArr = [];
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] instanceof Array) {
      flatArr.concat(flatten(arr[i]));
    } else {
      flatArr.push(arr[i]);
    }
  }
  return flatArr;
}


console.log(flatten([1, 2, 3, 4, [5]]));
/*
result: [1, 2, 3, 4]
expected: [1, 2, 3, 4, 5]
*/

但是不知道为什么结果不对。请帮我解释一下。

最佳答案

The concat() method returns a new array comprised of the array on which it is called joined with the array(s) and/or value(s) provided as arguments.

flatArr.concat(...) 不会改变 flatArr...你需要像这样分配它:

flatArr = flatArr.concat('flatten(arr[i]));

这是一个具有 3 层深度数组的工作示例:

function flatten(arr) {
  var flatArr = [];
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] instanceof Array) {
      flatArr = flatArr.concat(flatten(arr[i]));
    } else {
      flatArr.push(arr[i]);
    }
  }
  return flatArr;
}

var arr = [1,2,3,4,[5,6,[7,8]]];
var flatten = flatten(arr);

$('#result').html(JSON.stringify(flatten));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="result"></div>

您可以阅读更多关于 Array.concat function 的信息这里

关于javascript - 递归地展平数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35680969/

相关文章:

javascript - Rxjs 绑定(bind)创建 observable 的位置的上下文

javascript - 对象数组的操作

javascript - 正则表达式除了完整字符串而不是字符串内的部分

c++ - 重载==递归比较两个链表

java - 将增长递归翻译为迭代?

python - 岛屿的最大面积

c# - 为什么使用 Jquery 动态生成 DropDown 时只填充第一个 DropDown?

java - 用递归找到零点

php - 删除递归 PostgreSQL

javascript - 如何使这段代码更简单或缩短?