2017-12-26 48 views
2

ランダムに選択した文字列を別の文字列内の空白の各インスタンスに挿入しようとしています。空白の各インスタンスにランダムな文字列を挿入します。

var boom = 'hey there buddy roe'; 
var space = ' '; 
var words = ['cool','rad','tubular','woah', 'noice']; 
var random_words = words[Math.floor(Math.random()*words.length)]; 

for(var i=0; i<boom.length; i++) { 
    boom.split(' ').join(space + random_words + space); 
} 

出力が来る:

=> 'hey woah there woah buddy woah roe' 

私はランダムに配列から項目を選択するのですが、それは空白のインスタンスごとに同じ単語を使用しています。ループが空白に遭遇するたびに、ランダムに生成される単語が必要です。私が欲しいもの

は、より多くのようである:外観を取るための

=> 'hey cool there noice buddy tubular roe' 

感謝。

(これはBoomhauerのTwitterのボットのためのベータ版で、変数/文字列を言い訳)

答えて

5

たぶん、あなたは、あなたがランダムに一つの単語を選択してから交換しているのでしかし、あなたが望む結果が表示されない代わりに正規表現を使用することができますそれを伴うスペースのすべての出現。

以下の正規表現は、スペースのオカレンスをコールバックによって返される動的値に置き換えます。このコールバックをあなたのforループと比較することができますが、代わりに、見つかったスペースを繰り返しています。そうすることで、それぞれのオカレンスを 'ユニークな'ランダムな単語に置き換えることができます。

const boom = 'hey there buddy roe'; 
 
const words = ['cool', 'rad', 'tubular', 'woah', 'noice']; 
 
const random =() => Math.floor(Math.random() * words.length); 
 

 
let replace = boom.replace(/ /g,() => ` ${words[random()]} `); 
 

 
console.log(replace);

+2

は、私はあなたの答えが最適なものだと思います、しかし、あなたのコードは、特にOPとES6に慣れていない人のために、参考になる説明します。 – randomguy04

+0

うん、ちょうど私の答えを最初に取得したい – Callam

+1

フェア十分、良い答えとにかく、歓声。 – randomguy04

0

問題がrandom_wordsが単一の単語に設定されていること、です。

代わりにこれを試してみてください:

var boom = 'hey there buddy roe'; 
var words = ['cool','rad','tubular','woah', 'noice']; 

boom.replace(/ /g, (space)=> space + words[Math.floor(Math.random()*words.length)] + space); 
0

をあなたが望む効果を得るために、あなたはありません、それの外に、ループ内ワード選択を行う必要があります。

for(var i=0; i<boom.length; i++) { 
    // get a new number every loop 
    var random_words = words[Math.floor(Math.random()*words.length)]; 

    boom.split(' ').join(space + random_words + space); 
} 
-1

OPのコードで何が問題になっていますか:random_wordsはランダムな単語で1回のみ初期化されます。しかし、代わりに遭遇する全ての空白にランダムな単語を選択する意図がある。

あなたはどちらかと行くことができます。

for(var i=0; i<boom.length; i++) { 
    boom.split(' ').join(space + words[Math.floor(Math.random()*words.length)] + space); 
} 

...またはrandom_wordsランダムな単語を返す機能は、その後、あなたの「ブーム」ループの中でそれを呼び出すします。すべての呼び出しで、新しい単語選択が行われます。

-1

各ループでランダムな単語を再計算する必要があります。現在、あなたは単一のランダムな単語を選んで、random_words変数にそれを格納し、毎回それを再利用します。あなたはこのようなあなたのコードを変更できます。

var boom = 'hey there buddy roe'; 
 
var space = ' '; 
 
var words = ['cool','rad','tubular','woah', 'noice']; 
 

 
function getRandomWord() { 
 
    return words[Math.floor(Math.random()*words.length)]; 
 
} 
 

 
// Uses the same because the value given to join is not recalculated each time: 
 
console.log(boom.split(' ').join(space + getRandomWord() + space)); 
 

 
// You could do this with a standard for loop: 
 
let result = ""; 
 
let split = boom.split(' ') 
 
for(var i=0; i<split.length; i++) { 
 
    result += split[i] + space; 
 
    if (i === split.length - 1) break; 
 
    result += getRandomWord() + space; 
 
} 
 

 
console.log(result); 
 

 
// Or you can use a reduce: 
 
let otherResult = boom.split(' ').reduce((res, word, index, split) => { 
 
    if (index === split.length - 1) return res + space + word; 
 
    return res + space + word + space + getRandomWord(); 
 
}); 
 

 
console.log(otherResult)

関連する問題