javascript - 使用 `for` 与 `slice` : why are the returns of these two functions different? 的数组展平递归中的空值

标签 javascript arrays recursion interpreter

下面我提供了两个代码片段,在我看来,它们应该做同样的事情。在第一个片段中,我得到一个“空”值。我想这是因为当我在 上调用 steamrollArray(arr[0]) 时,null 值作为 arr 传递给函数[],将空值压入累加器。

我不知道,但我希望能得到一些帮助,避免这个特定问题的优雅方法是什么?

我希望两个函数在给定相同输入时提供相同的输出。

作为辅助点:我很想知道是否有人可以指出一种方法来将这两种方法相互比较 - 这是我一无所知的事情,除了它是“一件事, "这对我来说通常有助于理解如何做这样的事情,特别是如何处理这个问题。

作为另一个辅助点:是否有一个交互式 javascript 解释器,就像您可以获得一个交互式 python 解释器(您可以在其中玩/测试命令行中的东西)一样?

版本 1:“自然”递归 - 返回 [1,null,2,3]

function steamrollArray(arr) {
  // I'm a steamroller, baby
  //recursive (is an array)
  var accum = [];
  if (Array.isArray(arr)) {
    accum = accum.concat(steamrollArray(arr[0]));
    if (arr.length > 1) {
      accum = accum.concat(steamrollArray(arr.slice(1)));
    }
  } else {
    accum.push(arr);
  }
  return accum;
}

console.log(
  steamrollArray([1, [], [3, [[4]]]])
);

版本 2:for 循环递归 - 返回 [1,2,3]

function steamrollArray(arr) {
  // I'm a steamroller, baby
  //recursive (is an array)
  var accum = [];
  for (var i = 0; i < arr.length; i++) {
    if (Array.isArray(arr[i])) {
      accum = accum.concat(steamrollArray(arr[i]));
    } else {
      accum.push(arr[i]);
    }
  }
  return accum;
}

console.log(
  steamrollArray([1, [], [3, [[4]]]])
);

最佳答案

版本 1 中,您正在推送 arr[0]不检查 arr[0] 中是否有元素.所以在第二次调用 steamrollArray 时您传递空数组的位置 [] , arr[0]将是未定义的:

var arr = [];

console.log(arr[0]);

为什么这在版本 2 中没有发生?这是因为你有一个 for循环包装 push调用 ( for(var i = 0; i < arr.length... )。因此,当传递空数组时,for永远不会进入循环。因为0 < 0false .

您可以通过包装 push 来修复版本 1在这样的 if 语句中调用:(推送将在 steamrollArray 以参数 arr[0] 调用时发生)

if(arr.length) // if length is not 0
    accum = accum.concat(steamrollArray(arr[0]));

辅助 2: NodeJs是一个很棒的 javascript 运行时。它带有一个命令行界面。试试吧!

关于javascript - 使用 `for` 与 `slice` : why are the returns of these two functions different? 的数组展平递归中的空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42183073/

相关文章:

javascript - 还没有在 DOM 上的 JS 生成的 HTML 是什么?

javascript - 创建一个函数来接受二维数组并返回一个显示所有键的对象 :values

java - 使用 GUI 计算斐波那契方法

javascript - 如何迭代整个数组?然后更新数据库

Java - 递归停止了,我不明白为什么

javascript - 从对象属性递归生成文件路径

javascript - 通过单击 div 来选中复选框 - 不适用于其他功能

javascript - 当项目包含在数组中时,在 ng-repeat 上添加 Angular 类

Javascript:通过 eventListener 单击重新加载页面

javascript - 分块算法帮助 JS