【问题标题】:Randomizing (shuffling) an array with objects in JavaScript用 JavaScript 中的对象随机化(洗牌)数组
【发布时间】:2016-02-24 23:40:04
【问题描述】:

我最初使用来自先前问题的信息来弄清楚如何使用我在 Stack Overflow Q&A 中找到的信息来随机化数据。 (How to randomize (shuffle) a JavaScript array?) 在我最初的尝试中,我对女孩的名字和男孩的名字进行了单独的随机化。

var girls = shuffle([
    "Amanda",
    "Deja", 
    "Grace", 
    "Hailey",
    "Jada", 
    "Kylie",
    "Maria",
    "Shanice",
    "Victoria"
]);

var boys = shuffle([
    "Aiden",
    "Benjamin", 
    "Daniel",
    "Isaiah",
    "Jamal",
    "Maurice",
    "Steven",
    "Tyrone",
    "Zach"
]);

使用@gnarf提交的Fisher-Yates算法完成随机化:

function shuffle(array) {
    for (var i = array.length - 1; i > 0; i--) {
        var j = Math.floor(Math.random() * (i + 1));
        var temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
    return array;
}

当我仔细考虑并阅读更多内容时,我意识到我确实需要使用 JSON 而不是简单的数组。 JSON 对我来说是新的。我已经弄清楚如何设置它:

var npc = [{
  "npcName": "Amanda",
  "npcSex": "girl",
  "npcRisk": "1"
}, {
  "npcName": "Deja",
  "npcSex": "girl",
  "npcRisk": "2"
}, {
  "npcName": "Grace",
  "npcSex": "girl",
  "npcRisk": "3"
}, {
  "npcName": "Hailey",
  "npcSex": "girl",
  "npcRisk": "4"
}, {
  "npcName": "Jada",
  "npcSex": "girl",
  "npcRisk": "5"
}, {
  "npcName": "Kylie",
  "npcSex": "girl",
  "npcRisk": "6"
}, {
  "npcName": "Maria",
  "npcSex": "girl",
  "npcRisk": "7"
}, {
  "npcName": "Shanice",
  "npcSex": "girl",
  "npcRisk": "8"
}, {
  "npcName": "Victoria",
  "npcSex": "girl",
  "npcRisk": "9"
}, {
  "npcName": "Aiden",
  "npcSex": "boy",
  "npcRisk": "1"
}, {
  "npcName": "Benjamin",
  "npcSex": "boy",
  "npcRisk": "2"
}, {
  "npcName": "Daniel",
  "npcSex": "boy",
  "npcRisk": "3"
}, {
  "npcName": "Isaiah",
  "npcSex": "boy",
  "npcRisk": "4"
}, {
  "npcName": "Jamal",
  "npcSex": "boy",
  "npcRisk": "5"
}, {
  "npcName": "Maurice",
  "npcSex": "boy",
  "npcRisk": "6"
}, {
  "npcName": "Steven",
  "npcSex": "boy",
  "npcRisk": "7"
}, {
  "npcName": "Tyrone",
  "npcSex": "boy",
  "npcRisk": "8"
}, {
  "npcName": "Zach",
  "npcSex": "boy",
  "npcRisk": "9"
}];

我还没有弄清楚如何正确调用该函数或如何为女孩和男孩进行单独的随机化。因此,例如,随机化的结束应该用其他女孩的名字替换女孩的名字,但保持 npcRisk 的顺序相同。指导将不胜感激。

【问题讨论】:

  • 1) 你的问题中没有 JSON,2) 你有一个数组,而不是一个对象,3) stackoverflow.com/questions/2450954/… 的副本
  • 您提供了一个 JSON 对象数组,但没有实际的代码演示您尝试解析它的内容。关于如何使用和解析 JSON 对象的教程非常多。这是一篇陈旧但仍然完全相关的文章,可以帮助您入门。花时间学习使用 JSON 对象的基础知识,我敢打赌,在本文结束时,您将找到问题的答案。 copterlabs.com/json-what-it-is-how-it-works-how-to-use-it

标签: javascript random shuffle


【解决方案1】:

我假设您希望 npcRisk 保持不变,并且基本上只对 JSON 对象中的名称进行洗牌。这是一个简单的解决方案。它获取名称并按性别将它们分成两个数组,将您的逻辑应用于它们,然后重新插入新值。

function shuffleJSON(input) {
    var boys = [],
        girls = [];
    for (var i = 0; i < input.length; i++) {
        if (input[i].npcSex === 'boy') {
            boys.push(input[i].npcName);
        }
        if (input[i].npcSex === 'girl') {
            girls.push(input[i].npcName);
        }
    }

    boys = shuffle(boys);
    girls = shuffle(girls);

    for (var i = 0; i < input.length; i++) {
        if (input[i].npcSex === 'boy') {
            input[i].npcName = boys.shift();
        }
        if (input[i].npcSex === 'girl') {
            input[i].npcName = girls.shift();
        }
    }
    return input;
}

【讨论】:

    【解决方案2】:

    为什么不使用 RNG 来创建你的 NPC 数组?

    在我的头顶...

    var npcArray = [];
    //Set up name arrays
    var boysNames = ['Matthew', 'Mark', 'Luke' ....];
    var girlsNames = ['Daisy', 'Helen', 'Beth' ....];
    for (var i = 1; i <= 9; i++){
        var nameIndex = Math.floor(Math.random() * (boysNames.length - 1));
        //Create the NPC object using inline notation and add it to the array end of npcArray.  N.B. Array.splice() removes an element from the boysName array, hence the use of boysNames.length in the RNG.
        npcArray.push({
            npcName: boysNames.splice(nameIndex, 1),
            npcSex: 'boy',
            npcRisk: i
        });
    };
    for (var i = 1; i <= 9; i++){
        var nameIndex = Math.floor(Math.random() * (girlsNames.length - 1));
        npcArray.push({
            npcName: girlsNames.splice(nameIndex, 1),
            npcSex: 'girl',
            npcRisk: i
        });
    };
    

    【讨论】:

      【解决方案3】:

      您可以尝试使用Array.prototype.filter()Array.prototype.forEach()setTimeout()

      function shuffleProps(arr, prop, term) {
        var obj = {res:[]}; 
      
        obj[prop] = arr.filter(function(val, key) {
            return val[term] === prop
        });
      
        obj[prop].forEach(function(val, key, arr) {
          setTimeout(function() {
            obj["res"].push(val)
          }, Math.random() * 10)
        });
      
        return obj["res"]
      }
      
      var boys = shuffleProps(npc, "boy", "npcSex");
      

      【讨论】:

        猜你喜欢
        • 2011-04-12
        • 1970-01-01
        • 2010-12-03
        • 2015-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多