【发布时间】:2014-04-24 23:19:20
【问题描述】:
我只是在学习如何使用 JS 高阶函数(map、forEach、reduce 等),并陷入了混乱。我正在尝试编写一个简单的“范围”函数,但似乎无法填充我的输出数组。这是目标:
range(1, 4) // [1, 2, 3, 4]
我明白了:
[undefined × 4]
这是我的代码:
function range(num1, num2) {
var rangeArr = new Array((num2 + 1) - num1);
return rangeArr.map(function(e, i, arr) {return arr[i] = num1 + i});
}
我在这里缺少什么?据我所知,这个问题似乎与我使用“新阵列”的方式有关,但除此之外我迷路了。
哦,这才是真正让我困惑的部分。这工作正常:
function bleck() {
var blah = [1, 2, 3, 4];
var x = 'wtf';
return blah.map(function(e, i, arr) {return arr[i] = x})
}
["wtf", "wtf", "wtf", "wtf"]
谢谢!!
【问题讨论】:
-
不要认为你需要 "(num2 + 1) - num1)",因为 javascript 使用动态数组。
-
@Serdnad 这不是必需的,但它确实构造了一个该长度的空数组:
Array(4) = [undefined x 4] -
注意使用与您的问题无关的
.map():在您的回调中不需要return arr[i] = num1 + i,您可以直接说return num1 + i;。在arr中设置值是没有意义的——它与rangeArr是同一个数组——因为map构造了一个新数组,这就是你从range()函数返回的内容。 -
@Serdnad 你的意思是我可以简单地声明一个空数组吗?
-
@i_made_that 好吧,你可以。 Javascript 使用动态数组,因此它会在需要时增长。当然,你牺牲了一点性能,但有时它更方便,如果你不确定你需要多大的阵列,并且不想从一个庞大的阵列开始补偿。正如 cincodenada 所澄清的那样,没有必要。
标签: javascript arrays higher-order-functions