このようなものを簡単に書くためのJavascriptの方法はありますか?
[1,2,3].times do {
something();
}
同様の構文をサポートする可能性のあるライブラリはありますか?
更新:明確にするために-something()
を各配列要素の繰り返しに対してそれぞれ1、2、3回呼び出すようにしたい
この答えはArray.forEach
に基づいており、ライブラリはなく、ネイティブ Vanilla だけです。
基本的にsomething()
を3回呼び出すには、次を使用します。
[1,2,3].forEach(function(i) {
something();
});
次の機能を検討します。
function something(){ console.log('something') }
アウトプットは
something
something
something
この質問を完了するために、something()
をそれぞれ1、2、3回呼び出す方法を次に示します。
[1,2,3].forEach(i => Array(i).fill(i).forEach(_ => {
something()
}))
[1,2,3].forEach(function(i) {
Array(i).fill(i).forEach(function() {
something()
})
}))
どちらの場合でも、アウトプットは
アウトプットは
something
something
something
something
something
something
(1回、2回、3回)
ループを使用するだけです:
var times = 10;
for(var i=0; i < times; i++){
doSomething();
}
ES6の代替案。
Array.from(Array(3)).forEach((x, i) => {
something();
});
また、「それぞれ1、2、3回呼び出される」ようにしたい場合。
Array.from(Array(3)).forEach((x, i) => {
Array.from(Array(i+1)).forEach((x, i2) => {
console.log(`Something ${ i } ${ i2 }`)
});
});
filling-arrays-with-undefined から取得
これは、初期配列を作成するより最適化された方法のようです。
Array.from({ length: 3 }).forEach((x, i) => {
something();
});
アンダースコアについて言及しているため:
f
が呼び出したい関数であると仮定します:
_.each([1,2,3], function (n) { _.times(n, f) });
トリックを行います。たとえば、f = function (x) { console.log(x); }
を使用すると、コンソールにアクセスできます:0 0 1 0 1 2
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) );
(式の名前を問わず)関数式を作成し、それにアクセスする(プロトタイプの)任意のプロパティ名に割り当てる必要があります。
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;
times = function () {
var length = arguments.length;
for (var i = 0; i < length ; i++) {
for (var j = 0; j < arguments[i]; j++) {
dosomthing();
}
}
}
次のように呼び出すことができます。
times(3,4);
times(1,2,3,4);
times(1,3,5,7,9);
使用できます
Array.forEach
例:
function logArrayElements(element, index, array) {
console.log("a[" + index + "] = " + element);
}
[2, 5, 9].forEach(logArrayElements)
またはjQueryを使用
$.each([52, 97], function(index, value) {
alert(index + ': ' + value);
});
Ramdaと呼ばれる素晴らしいライブラリがあります。これは、UnderscoreとLodashに似ていますが、より強力です。
const R = require('ramda');
R.call(R.times(() => {
console.log('do something')
}), 5);
Ramdaには多くの便利な機能が含まれています。 Ramdaドキュメント を参照してください
// calls doSomething 42 times
Array( 42 ).join( "x" ).split( "" ).forEach( doSomething );
そして
// creates 42 somethings
var somethings = Array( 42 ).join( "x" ).split( "" ).map( () => buildSomething(); );
または( https://stackoverflow.com/a/20066663/275501 経由)
Array.apply(null, {length: 42}).forEach( doSomething );
var times = [1,2,3];
for(var i = 0; i < times.length; i++) {
for(var j = 0; j < times[i];j++) {
// do something
}
}
JQuery .each()
を使用する
$([1,2,3]).each(function(i, val) {
for(var j = 0; j < val;j++) {
// do something
}
});
OR
var x = [1,2,3];
$(x).each(function(i, val) {
for(var j = 0; j < val;j++) {
// do something
}
});
あなたは純粋なJSで以下のようにすることができます:
var times = [1,2,3];
times.forEach(function(i) {
// do something
});
配列の長さを使用して、タスクを何回でも実行できます。
var arr = [1,2,3];
for(var i=0; i < arr.length; i++){
doSomething();
}
または
var arr = [1,2,3];
do
{
}
while (i++ < arr.length);
ネストされたループを使用するだけです(関数に囲まれている場合があります)
function times( fct, times ) {
for( var i=0; i<times.length; ++i ) {
for( var j=0; j<times[i]; ++j ) {
fct();
}
}
}
次に、このように呼び出します:
times( doSomething, [1,2,3] );
スプレッド演算子のようなES6構文を使用できると仮定すると、コレクション内のすべての数値の合計と同じくらいの回数を実行したいと思うでしょう。
この場合、timesが[1,2,3]
に等しい場合、合計回数は6、つまり1 + 2 + 3になります。
/**
* @param {number[]} times
* @param {cb} function
*/
function doTimes(times, cb) {
// Get the sum of all the times
const totalTimes = times.reduce((acc, time) => acc + time);
// Call the callback as many times as the sum
[...Array(totalTimes)].map(cb);
}
doTimes([1,2,3], () => console.log('something'));
// => Prints 'something' 6 times
この投稿は、配列の構築と拡散の背後にあるロジックが明らかでない場合、 役に立つ である必要があります。
これらの答えはすべて良好であり、IMO @Andreasが最適ですが、JSでは多くの場合、非同期に処理する必要があります。その場合、asyncで対応できます。
http://caolan.github.io/async/docs.html#times
const async = require('async');
async.times(5, function(n, next) {
createUser(n, function(err, user) {
next(err, user);
});
}, function(err, users) {
// we should now have 5 users
});
これらの「時間」機能は、ほとんどのアプリケーションコードにとって非常に便利ですが、テストには便利です。
function doSomthing() {
...
}
次のように使用します。
Array.from(Array(length).keys()).forEach(doSomthing);
または
Array.from({ length }, (v, i) => i).forEach(doSomthing);
または
// array start counting from 1
Array.from({ length }, (v, i) => ++i).forEach(doSomthing);
const loop (fn, times) => {
if (!times) { return }
fn()
loop(fn, times - 1)
}
loop(something, 3)
Array.from
および.forEach
を使用します。
let length = 5;
Array.from({length}).forEach((v, i) => {
console.log(`#${i}`);
});