web-dev-qa-db-ja.com

<something> N回実行(宣言構文)

このようなものを簡単に書くためのJavascriptの方法はありますか?

[1,2,3].times do {
  something();
}

同様の構文をサポートする可能性のあるライブラリはありますか?

更新:明確にするために-something()を各配列要素の繰り返しに対してそれぞれ1、2、3回呼び出すようにしたい

65
BreakPhreak

この答えはArray.forEachに基づいており、ライブラリはなく、ネイティブ Vanilla だけです。

基本的にsomething()を3回呼び出すには、次を使用します。

[1,2,3].forEach(function(i) {
  something();
});

次の機能を検討します。

function something(){ console.log('something') }

アウトプットは

something
something
something

この質問を完了するために、something()をそれぞれ1、2、3回呼び出す方法を次に示します。

2017年です。ES6を使用できます。

[1,2,3].forEach(i => Array(i).fill(i).forEach(_ => {
  something()
}))

または古き良きES5の場合:

[1,2,3].forEach(function(i) {
  Array(i).fill(i).forEach(function() {
    something()
  })
}))

どちらの場合でも、アウトプットは

アウトプットは

something

something
something

something
something
something

(1回、2回、3回)

33
vinyll

ループを使用するだけです:

var times = 10;
for(var i=0; i < times; i++){
    doSomething();
}
67
ahren

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();
});
41
nverba

アンダースコアについて言及しているため:

fが呼び出したい関数であると仮定します:

_.each([1,2,3], function (n) { _.times(n, f) });

トリックを行います。たとえば、f = function (x) { console.log(x); }を使用すると、コンソールにアクセスできます:0 0 1 0 1 2

19
ggozad

lodash を使用して、この作業を行うことができます。

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

//Or:
_.each([1, 2, 3], doSomeThing);

または、N回何かをしたい場合

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

//Or: 
_.times(n, doSomeThing);

参照 このリンクlodashインストール用

14
Tho

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;
9

配列を作成し、 fillundefinedを持つすべてのアイテムを作成します。したがって、 map メソッドが機能します。

Array.fillにはIEサポートがありません

Array(5).fill().map(()=>{ 
   // Do this 5 times:
   console.log(111) 
})

古い学校の崇拝ループを使用する:

for( let i=5; i--; ){
   // Do this 5 times:
   console.log(222) 
}
6
vsync
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);
1
XU3352

使用できます

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); 
});

http://api.jquery.com/jQuery.each/

1
Machu

Ramdaと呼ばれる素晴らしいライブラリがあります。これは、UnderscoreとLodashに似ていますが、より強力です。

const R = require('ramda');

R.call(R.times(() => {
    console.log('do something')
}), 5);

Ramdaには多くの便利な機能が含まれています。 Ramdaドキュメント を参照してください

1
Jan Bodnar
// 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 );
1
goofballLogic
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
});
1
thecodeparadox

配列の長さを使用して、タスクを何回でも実行できます。

var arr = [1,2,3];

for(var i=0; i < arr.length; i++){
    doSomething();
}

または

 var arr = [1,2,3];

 do
 {


 }
 while (i++ < arr.length);
1
Adil

ネストされたループを使用するだけです(関数に囲まれている場合があります)

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] );
0
Sirko

スプレッド演算子のような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

この投稿は、配列の構築と拡散の背後にあるロジックが明らかでない場合、 役に立つ である必要があります。

0
IliasT

これらの答えはすべて良好であり、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
});

これらの「時間」機能は、ほとんどのアプリケーションコードにとって非常に便利ですが、テストには便利です。

0
Alexander Mills

Array.from (ES6)

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);
0
Lior Elrom
const loop (fn, times) => {
  if (!times) { return }
  fn()
  loop(fn, times - 1)
}

loop(something, 3)
0
Goro

Array.fromおよび.forEachを使用します。

let length = 5;
Array.from({length}).forEach((v, i) => {
  console.log(`#${i}`);
});
0
SeregPie