Javascript “可能的功能替代品是什么?”;对于(var i=0;i<;size;i+;+;)而言;环
我要纯香草溶液。我写了很多东西Javascript “可能的功能替代品是什么?”;对于(var i=0;i<;size;i+;+;)而言;环,javascript,functional-programming,Javascript,Functional Programming,我要纯香草溶液。我写了很多东西 for(var i=0;i
for(var i=0;i
请注意,它不是用于迭代数组或DOM节点,而是主要用于纯计算
我想要更实用的方法,因为我很懒。比如:
新数组(15).forEach(函数(i,idx){
...
...
})
但这不起作用
使用时,我曾经写作
_.range(0100,4).forEach(函数(i,idx){
与(i)有关的剂量;
});
请不要说它可能不实用,但我喜欢弯曲Javascript。不确定您真正想要什么,但您可以使用一个通用迭代器函数来管理循环计数器:
function loop(start, stop, fn) {
for (var i = start; i < stop; i++) {
if (fn(i) === false) {
return;
}
}
}
您甚至可以将起始值设置为可选(如果不存在,则默认为零):
功能循环(启动、停止、fn){
如果(!fn){
fn=停止;
停止=启动;
开始=0;
}
对于(变量i=开始;i<停止;i++){
如果(fn(i)==false){
返回;
}
}
}
循环(大小、功能(i){
//我在这里使用
});
不确定您真正想要什么,但您可以使用一个通用迭代器函数为您管理循环计数器:
function loop(start, stop, fn) {
for (var i = start; i < stop; i++) {
if (fn(i) === false) {
return;
}
}
}
您甚至可以将起始值设置为可选(如果不存在,则默认为零):
功能循环(启动、停止、fn){
如果(!fn){
fn=停止;
停止=启动;
开始=0;
}
对于(变量i=开始;i<停止;i++){
如果(fn(i)==false){
返回;
}
}
}
循环(大小、功能(i){
//我在这里使用
});
这不起作用的原因似乎是因为forEach
没有迭代像这样使用数组构造函数时设置的未定义的值
forEach
适用于实际包含内容的数组,当您运行这样的代码时就会看到:
loop(0, size, function(i) {
// use i here
});
[1,2,3,4,5,6,7,8].forEach(function(){console.log(arguments)});
[].init('foo', 3);
// ["foo", "foo", "foo"]
[].init(60, 4);
// [60, 60, 60, 60]
[].init({}, 3);
// [{},{},{}]
[].init(true, 9);
// [true, true, true, true, true, true, true, true, true]
所以,现在,您需要的是正确地初始化一个包含内容的新数组
在这方面有一些有用的答案。
最短的解决方案似乎是:
new Array(5+1).join('0').split('')
您只需在此之后链接forEach
或者,您也可以从该问题中投票率较高的答案中选出一个原型:
Array.prototype.init = function(value, length){
return Array.apply(null, new Array(length)).map(function(){
return value.valueOf();
},value);
}
这允许您执行以下操作:
loop(0, size, function(i) {
// use i here
});
[1,2,3,4,5,6,7,8].forEach(function(){console.log(arguments)});
[].init('foo', 3);
// ["foo", "foo", "foo"]
[].init(60, 4);
// [60, 60, 60, 60]
[].init({}, 3);
// [{},{},{}]
[].init(true, 9);
// [true, true, true, true, true, true, true, true, true]
当然,您可以在init()
之后链接.forEach()
(实际上,如果不将此函数添加到Array.prototype
,您可以使用init()
,而不使用数组文字。这可能是一个“更干净”的解决方案)这不起作用的原因,这似乎是因为forEach
没有迭代像这样使用数组构造函数时设置的未定义的值
forEach
适用于实际包含内容的数组,当您运行这样的代码时就会看到:
loop(0, size, function(i) {
// use i here
});
[1,2,3,4,5,6,7,8].forEach(function(){console.log(arguments)});
[].init('foo', 3);
// ["foo", "foo", "foo"]
[].init(60, 4);
// [60, 60, 60, 60]
[].init({}, 3);
// [{},{},{}]
[].init(true, 9);
// [true, true, true, true, true, true, true, true, true]
所以,现在,您需要的是正确地初始化一个包含内容的新数组
在这方面有一些有用的答案。
最短的解决方案似乎是:
new Array(5+1).join('0').split('')
您只需在此之后链接forEach
或者,您也可以从该问题中投票率较高的答案中选出一个原型:
Array.prototype.init = function(value, length){
return Array.apply(null, new Array(length)).map(function(){
return value.valueOf();
},value);
}
这允许您执行以下操作:
loop(0, size, function(i) {
// use i here
});
[1,2,3,4,5,6,7,8].forEach(function(){console.log(arguments)});
[].init('foo', 3);
// ["foo", "foo", "foo"]
[].init(60, 4);
// [60, 60, 60, 60]
[].init({}, 3);
// [{},{},{}]
[].init(true, 9);
// [true, true, true, true, true, true, true, true, true]
当然,您可以在init()
之后链接.forEach()
(实际上,如果您不将此函数添加到Array.prototype
,您可以只使用init()
,而不使用数组文本。这可能是一个“更干净”的解决方案)可能重复为什么只为了迭代一个数字序列而组成数组?为什么不制作一个辅助函数来进行迭代(如我的答案所示)?我想我很困惑,为什么你认为制作一个虚拟数组只是为了迭代一个数字序列是理想的解决方案?你是对的,我之所以创建一个虚拟数组是因为forEach
。看起来你的答案是最适合我的。为什么要组成一个数组来遍历一个数字序列呢?为什么不制作一个辅助函数来进行迭代(如我的答案所示)?我想我很困惑,为什么你认为制作一个虚拟数组只是为了迭代一个数字序列是理想的解决方案?你是对的,我之所以创建一个虚拟数组是因为forEach
。看来你的答案最适合我了。谢谢。至于新数组(5).join('').split('').forEach()
这对我来说似乎太过分了:)@lukas.pukenis:我同意:P我建议的原型怎么样?如果你经常使用它,那可能是值得的。我不介意在原型中添加东西,你的解决方案真的很棒,谢谢!谢谢至于新数组(5).join('').split('').forEach()
这对我来说似乎太过分了:)@lukas.pukenis:我同意:P我建议的原型怎么样?如果你经常使用它,那可能是值得的。我不介意在原型中添加东西,你的解决方案真的很棒,谢谢!谢谢,我还没有想到一个简单的通用解决方案,正在寻找一些魔法!:)谢谢,我还没有想到一个简单的通用解决方案,正在寻找一些魔法!:)