做<something> N次(声明性语法)

Bre*_*eak 69 javascript jquery underscore.js

有没有办法在Javascript中轻松编写这样的东西:

[1,2,3].times do {
  something();
}
Run Code Online (Sandbox Code Playgroud)

任何可能支持某些类似语法的库可能吗?

更新:澄清 - 我希望something()每个数组元素迭代分别调用1,2和3次

ahr*_*ren 72

只需使用一个循环:

var times = 10;
for(var i=0; i < times; i++){
    doSomething();
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!我想从声明性语法中受益(就像茉莉花一样) (3认同)
  • 是的,但是函数式 for 循环声明性语法也会更好 (3认同)
  • 是的,拜托,我已经厌倦了无缘无故地被迫发表声明。这是一个在您需要时使用的好工具,但它并不是一个神圣的任务。 (3认同)
  • 或者,如果您希望减少击键次数,请使用“while(times--)”! (3认同)

nve*_*rba 47

可能的ES6替代方案.

Array.from(Array(3)).forEach((x, i) => {
  something();
});
Run Code Online (Sandbox Code Playgroud)

并且,如果你想要它"分别被称为1,2和3次".

Array.from(Array(3)).forEach((x, i) => {
  Array.from(Array(i+1)).forEach((x, i2) => {
    console.log(`Something ${ i } ${ i2 }`)
  });
});
Run Code Online (Sandbox Code Playgroud)

更新:

取自填充数组 - 未定义

这似乎是创建初始数组的更优化方式.

Array.from({ length: 3 }, (x, i) => {
  something();
});
Run Code Online (Sandbox Code Playgroud)

  • [`Array.from()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from) 有一个可选的第二个参数 `mapFn`,它允许您对数组的每个元素执行map函数,因此不需要使用forEach。你可以这样做: `Array.from({length: 3}, () =&gt; somthing() )` (5认同)
  • 我应该告诉你这是好的,如果你只是快速编写一些东西,但性能很糟糕,所以不要用它来进行密集递归或生产. (3认同)
  • 如果简洁是目标(实际上,即使不是),请传递函数而不是调用它:`Array.from(Array(3))。forEach(something)` (3认同)

vin*_*yll 37

这个答案是基于Array.forEach,没有任何库,只是本机香草.

基本上要打something()3次,使用:

[1,2,3].forEach(function(i) {
  something();
});
Run Code Online (Sandbox Code Playgroud)

考虑以下功能:

function something(){ console.log('something') }
Run Code Online (Sandbox Code Playgroud)

输出将是

something
something
something
Run Code Online (Sandbox Code Playgroud)

要完成这些问题,这里something()分别进行1,2和3次调用:

这是2017年,您可以使用ES6:

[1,2,3].forEach(i => Array(i).fill(i).forEach(_ => {
  something()
}))
Run Code Online (Sandbox Code Playgroud)

或者在旧的ES5中:

[1,2,3].forEach(function(i) {
  Array(i).fill(i).forEach(function() {
    something()
  })
}))
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,输出都将是

输出将是

something

something
something

something
something
something
Run Code Online (Sandbox Code Playgroud)

(一次,然后两次,然后3次)

  • 这是不正确的,因为它不满足问题的这一部分:'我想要某事()被称为1,2和3次'.使用此代码`something`只被调用3次,应该被调用6次. (14认同)
  • 您还可以使用 `[...Array(i)]` 或 `Array(i).fill()`,具体取决于您对实际索引的需求。 (3认同)

ggo*_*zad 19

因为你提到了下划线:

假设f您要调用的函数:

_.each([1,2,3], function (n) { _.times(n, f) });
Run Code Online (Sandbox Code Playgroud)

会做的.例如,有了f = function (x) { console.log(x); },你将进入你的控制台: 0 0 1 0 1 2

  • 作为旁注:`_(次).(f)`也适用 (3认同)
  • `_(3).times(function(n){return n;});` 应该可以解决问题。[请参阅此处的文档。](http://underscorejs.org/#times) (2认同)

Tho*_*Tho 15

我们可以使用lodash来完成这项工作:

_.each([1, 2, 3], function(item) {
   doSomeThing(item);
});

//Or:
_.each([1, 2, 3], doSomeThing);
Run Code Online (Sandbox Code Playgroud)

或者如果你想做N次:

var n = 10;
_.times(n, function() {
   doSomeThing();
});

//Or: 
_.times(n, doSomeThing);
Run Code Online (Sandbox Code Playgroud)

参考此链接进行lodash安装


Oza*_*man 15

你也可以用如下解构做同样的事情

[...Array(3)].forEach( _ => console.log('do something'));
Run Code Online (Sandbox Code Playgroud)

或者如果你需要索引

[...Array(3)].forEach(( _, index) => console.log('do something'));
Run Code Online (Sandbox Code Playgroud)


Web*_*nan 14

简单的一会儿怎么样。

let times = 5;

while (times--) {

    console.log(times+1)

}
Run Code Online (Sandbox Code Playgroud)

有关其工作原理的参考资料:FalsyDecrement (--)


编辑:如果有可能times在其他地方进行操作,那么使用它会更安全,times-- > 0而不是在低于以下值的times--情况下防止无限循环times0


And*_*röm 8

如果你不能使用Underscorejs,你可以自己实现它.通过将新方法附加到Number和String原型,您可以这样做(使用ES6箭头函数):

// With String
"5".times( (i) => console.log("number "+i) );

// With number variable
var five = 5;
five.times( (i) => console.log("number "+i) );

// With number literal (parentheses required)
(5).times( (i) => console.log("number "+i) );
Run Code Online (Sandbox Code Playgroud)

您只需要创建一个函数表达式(无论名称),并将其分配给您想要访问它的任何属性名称(在原型上):

var timesFunction = function(callback) {
  if (typeof callback !== "function" ) {
    throw new TypeError("Callback is not a function");
  } else if( isNaN(parseInt(Number(this.valueOf()))) ) {
    throw new TypeError("Object is not a valid number");
  }
  for (var i = 0; i < Number(this.valueOf()); i++) {
    callback(i);
  }
};

String.prototype.times = timesFunction;
Number.prototype.times = timesFunction;
Run Code Online (Sandbox Code Playgroud)


vsy*_*ync 8

创建一个数组,fill所有带有undefinedso map方法的项都可以工作:

Array.fill 没有IE支持

Array(5).fill().map(()=>{ 
   // Do this 5 times:
   console.log(111) 
})
Run Code Online (Sandbox Code Playgroud)


使用老式的崇敬循环:

for( let i=5; i--; ){
   // Do this 5 times:
   console.log(222) 
}
Run Code Online (Sandbox Code Playgroud)

  • 出于安全考虑,我运行了一个 uuid 函数**50k 次**,以确保它永远不会重复 uuid。因此,我对顶部循环与底部循环进行了分析,只是为了好玩,只是使用 chrome 开发工具在正常页面加载的中间运行 **如果我不傻的话,我认为它的 ~12 亿与使用 Array.indexOf()** 相比生成 50k uuid。**newschool = 1st-5561.2ms 2nd-5426.8ms | oldschool = 1st-4966.3ms / 2nd-4929.0ms** 这个故事的寓意是,如果你不在十亿以上的范围内,你永远不会注意到运行 200、1k、甚至 10k 次来做某事的差异。我想有人可能像我一样好奇。 (4认同)
  • 很明显,阅读此线程的每个人都知道您没有提供示例来比较它们的速度。我只是碰巧用它们来运行一个小测试,并认为我会分享一些未来可能会发现有趣的信息。我不是很正确,因为我并没有真正回答一个问题,只是显示信息并提醒您不要担心循环的速度,因为您只做几件事无论如何都会在几毫秒内结束。它也不是真的知道,因为一年前在 ie 中的相同测试可能会发现速度慢 50%,因为浏览器一直在变化。 (3认同)
  • 或 `for(var i=10; i--; console.log(i));` (3认同)