Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 重写展平函数_Javascript_Arrays_Underscore.js - Fatal编程技术网

Javascript 重写展平函数

Javascript 重写展平函数,javascript,arrays,underscore.js,Javascript,Arrays,Underscore.js,我已经编写了一个版本的下划线z.flatte函数,它可以工作,但我不明白为什么第一个版本可以工作,而第二个版本不行 var flatten = function (array, result) { var result = []; for (var i = 0; i < array.length; i++) { var current = array[i]; if (Array.isArray(current)) { result.push.apply(

我已经编写了一个版本的下划线z.flatte函数,它可以工作,但我不明白为什么第一个版本可以工作,而第二个版本不行

var flatten = function (array, result) {
  var result = [];
  for (var i = 0; i < array.length; i++) {
    var current = array[i];
    if (Array.isArray(current)) {
      result.push.apply(array, flatten(current));
    }
    else {
      result.push(current);
    }
  }
  return result;
};

var nested = [1, [2], [3, [[[4]]]]];
console.log(flatten(nested));
// [1,2,3,4]

您将错误的第一个参数传递给
result.push.apply

result.push.apply(array, flatten(current));
// ---------------^^^^^
您想在
result
上调用
push
,但实际上是在调用
array.push
。你想说:

result.push.apply(result, flatten(current));
因此,
push
在调用时将
result
作为它的
this


一个更有趣的问题是,为什么基于
实现“有效”,即使它的实现很混乱。如果你扔

console.log(nested);
在第一个示例的底部,您将看到基于
的实现的
将其参数弄得一团糟;因此,在“作品”中出现了令人恐惧的引语

如果你在精神上仔细检查你的
,如果

if (Array.isArray(current)) {
  result.push.apply(array, flatten(current));
}
else {
  result.push(current);
}
您将看到,在迭代时,它正在修改数组。但是它添加到
array
中的所有内容都是另一个数组,而非数组最终会出现在
result
中您想要的位置

如果您从以下内容开始:

var nested = [1, [2], [3, [[[4]]]], 5]
您将看到它以另一种方式不起作用,因为您最终会遇到:

[1, 5, 2, 3, 4]

作为最终结果(以及嵌套的
中的一些其他混乱)。基于
的实现的似乎只起作用,因为您碰巧给了它一个特殊的结构化输入。

传递给它的是什么数据以便我们可以测试?它就在底部;嵌套数组>>“var nested=[1,[2],[3,[[4]]];”为什么您的函数有一个从未使用过的
结果
参数?您能解释一下为什么它在第一个参数中工作正常吗?更困惑的是为什么它在那里起作用,而不是他不起作用solution@dave当你的评论进来时,我正在研究这个问题。第一个根本不起作用。但是,是的,这是一个更有趣的问题:)非常感谢你,现在看起来很明显,我真不敢相信我以前甚至没有看到过@Muistooshort也花了我一段时间才发现它,尽管我一直在看
结果。push.apply
call:最难发现的问题是那些在公开场合盯着你看的问题。
[1, 5, 2, 3, 4]