随机的JavaScript?

时间:2011-03-07 03:03:00

标签: javascript arrays object random

我有一个类似于

的对象
names = {
  m: [
       'adam',
       'luke',
       'mark',
       'john'
     ],
  f: [
       'lucy',
       'mary',
       'jill',
       'racheal'
     ],
  l: [
       'smith',
       'hancock',
       'williams',
       'browne'
     ]
};

我想做的是。

我得到一个看起来像

的字符串
  

{m} {l}是男性名称,因此{f} {l}是女性名称,{r} {l}必须是/或(随机)性别名称

我想让它从正确的键中随机填充。

所以你可能会得到

  

luke browne是男性名字,所以racheal smith是女性名字,mary browne必须是/或(随机)性别名称

我将如何做到这一点?

函数框架看起来像

function names(mask, callback){}

代码的最后一行是callback(replaced)

5 个答案:

答案 0 :(得分:3)

您可以使用Math.random()获取0到1之间的随机值。从那里,您可以使用Math.ceil()Math.floor()进行乘法,以获得所需的值范围。

答案 1 :(得分:2)

对于这个问题,您需要了解两部分JavaScript:

  1. Math.random(),这是在JavaScript中生成随机数的唯一方法。它生成一个介于0和1之间的数字;您可以使用0获得n - 1Math.floor(Math.random() * n)之间的随机整数。
  2. 正则表达式,用于从掩码中获取“模板”字符串,以及用于执行替换。表达式mask.match(/{.}/)[0]将为您提供掩码中的第一个模板字符串(例如,在给定的情况下为'{m}')。
  3. 要用'{m}'替换mask中的'foo',您需要写

    mask = mask.replace(/{m}/, 'foo');
    

    将上述所有概念放在while (mask.match(/{.}/)循环中,瞧!

答案 2 :(得分:1)

首先,您必须匹配大括号内的字符,您可以使用正则表达式来执行此操作:

/\{(\w)\}/g

另请注意,您的模板包含{r}标记,该标记在对象中不存在。让我们自己填充:

names.r = names.m.concat(names.f);

此处,names.r中的元素是names.mnames.f的名称。然后,您可以使用string.replace替换它们。

您可以改为提供一个动态计算替换字符串的函数,而不是提供被替换的子字符串。

function replaceNames(mask, callback) {
    callback(mask.replace(/\{(\w)\}/g, function(all, category) {
        var arr = names[category];
        return arr[Math.floor(Math.random() * arr.length)];
    }));
}

答案 3 :(得分:0)

您可以这样做:

function randomName(names){
    var _names = [];
    for(i in names) _names.push(i);
    var random = Math.floor(Math.random()*_names.length);
    if(random) random -= 1; // only m and f
    return names[_names[random]][Math.floor(Math.random()*names[_names[random]].length)];
    }

答案 4 :(得分:0)

你应该使用两个函数:第一个解析掩码,然后第二个随机选择名称。

解析面具很简单。正则表达式可用于检索所有键的数组。然后你可以循环执行这些替换。

function names(mask, callback) {

    var replaced = mask;

    //get an array of all the keys (with braces)
    var keys = mask.match(/{[mflr]}/g);

    for (var i=0; i<keys.length; i++) {

        //extract the "f" from "{f}"
        var type = keys[i].charAt(1);

        //make the replacement
        replaced = replaced.replace(keys[i], getNameFromObject(type));
    }

    callback(replaced);
}

第二个函数的作用是在给定某种类型的情况下从名称对象中选择一个名称。在该问题中,该对象具有标识符“names”。这也是解析掩码的函数的标识符。我建议将对象重命名为类似于“allNames”的东西,因为它可以避免可能的命名空间冲突,并且更能表达对象的本质。

根据建议,Math.random()和Math.floor()用于选择名称的随机索引。你不应该使用Math.ceil(),因为这可能会导致一个错误,或者需要减一个。

function getNameFromObject(type) {

    if (type == 'r')
        type = (Math.random() > 0.5)? 'm' : 'f';

    //assuming that the object has the type of name being requested
    //NOTE: "allNames" is used as the identifier of the data object
    var possibleNames = allNames[type];

    //assuming the arrays can't be empty
    var randomIndex = Math.floor(Math.random() * possibleNames.length);
    return possibleNames[randomIndex];
}