将随机字符串插入每个空格实例

时间:2017-12-26 22:34:14

标签: javascript arrays string random

我试图将随机选择的字符串插入到另一个字符串中的每个空格实例中。

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 个答案:

答案 0 :(得分:5)

也许您可以使用正则表达式,但是,您没有看到您想要的结果,因为您随机选择一个单词,然后用它替换所有出现的空格。

下面的正则表达式用回调返回的动态值替换空格的出现。你可以将这个回调与你的for循环进行比较,但是,它会迭代找到的空格,这样你就可以用一个独特的&#39;来替换每个匹配项。随机词。

&#13;
&#13;
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);
&#13;
&#13;
&#13;

答案 1 :(得分: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);

答案 2 :(得分: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);
}

答案 3 :(得分:-1)

OP的代码有什么问题:random_words只用一个随机字初始化一次。但是,意图是为每个遇到的空格选择随机字。

你可以选择:

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

...或者使random_words成为函数,它会返回一个随机字,然后在你的繁荣中调用它。环。每次通话都会发生新的单词选择。

答案 4 :(得分:-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)