【问题标题】:javascript randoms?javascript随机数?
【发布时间】:2011-07-10 01:54:42
【问题描述】:

我有一个看起来像这样的对象

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)

【问题讨论】:

  • 用数据“名称”来命名所需的函数和对象是不是有点混乱?
  • 如果函数是唯一访问对象的东西,它实际上有助于表示关系!

标签: javascript arrays object random


【解决方案1】:

您可以使用 Math.random() 获得介于 0 和 1 之间的随机值。从那里您可以使用 Math.ceil()Math.floor() 与乘法来获得所需的值范围。

【讨论】:

  • 那么像names['f'][Math.floor(Math.random() * names.f.length)] 这样的东西可以吗?
  • 是的,这正是您想要的。其余的你可以用mask.replace("{m}", theValueYouJustGotAbove)
【解决方案2】:

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

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

要将mask 中的'{m}' 替换为'foo',您可以这样写

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

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

【讨论】:

    【解决方案3】:

    首先,你要匹配大括号内的一个字符,你可以使用正则表达式来做到这一点:

    /\{(\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)];
        }));
    }
    

    【讨论】:

    • names.r = names.m.concat(names.f); 比我简单地生成 1 或 0 并使用它来选择 m 或 f 的方法要好得多。
    【解决方案4】:

    你可以这样做:

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

    【讨论】:

      【解决方案5】:

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

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

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

      第二个函数的作用是从名字的对象中选择一个名字,给定一个特定的类型。在问题中,此对象具有标识符“名称”。这也是解析掩码的函数的标识符。我建议将对象重命名为类似于“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];
      }
      

      【讨论】:

        猜你喜欢
        • 2016-11-05
        • 2010-11-10
        • 1970-01-01
        • 1970-01-01
        • 2016-04-01
        • 2013-07-05
        • 1970-01-01
        • 1970-01-01
        • 2011-01-27
        相关资源
        最近更新 更多