Javascript 重写展平函数
我已经编写了一个版本的下划线z.flatte函数,它可以工作,但我不明白为什么第一个版本可以工作,而第二个版本不行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(
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]