简体   繁体   English

防止两次选择数组项

[英]Prevent array item from being selected twice

How do I prevent a number being selected twice from an array within a for loop? 如何防止在for循环中从数组中两次选择一个数字? In this case, I want to make sure pictureNo is unique each time. 在这种情况下,我想确保pictureNo每次都是唯一的。

$(document).ready(function () {
        // Generate timeline items
        var timelineItemCount = Math.floor(Math.random() * 9) + 1;
        for(i=0;i<timelineItemCount;i++)
        {
            generateTimeline();
        }
    });

function generateTimeline() {
    // Select gender
    var genderArray = ['male','female'];
    var gender = genderArray[Math.floor(Math.random()*genderArray.length)]; 

    // Select profile picture - how do I prevent the same number from being selected once here
    var pictureNo = Math.floor(Math.random() * 19) + 1;

    // Create timeline entry    
    $('#home-page').append($('<div class="timeline-item"><img src="assets/img/' + gender + '_profile' + pictureNo + '.jpg" alt="" class="img-rounded profile"></div>'));    
}

Try and store the randomly selected numbers so every time a new number is randomly selected you have a condition to compare it with the previously selected numbers. 尝试存储随机选择的数字,以便每次随机选择一个新数字时,您都有条件将其与之前选择的数字进行比较。 If the number was previously selected then a new random number should be selected. 如果先前选择了该数字,则应选择一个新的随机数。

Create an array outside the for loop and store the random numbers being generated. 在for循环外创建一个数组,并存储生成的随机数。 At each iteration of the for loop, check if the new random number belongs to the array. 在for循环的每次迭代中,检查新的随机数是否属于该数组。 When the for loop finishes, reset the array to the empty array. 当for循环完成时,将数组重置为空数组。

Lets define two arrays of male and female indices, genders array, shuffle them and pop some items. 让我们定义两个由男性和女性组成的索引数组,一个由性别组成的数组,对它们进行混洗并弹出一些项目。 It is easy to do with Underscore.JS, for example: 使用Underscore.JS很容易,例如:

var malesCount = 20;
var femalesCount = 20;

var profiles = {
  'male' : _.shuffle(_.range(1, malesCount + 1)),
  'female' : _.shuffle(_.range(1, femalesCount + 1)),
};

var genders = [];
for (var index = 0; index < malesCount; index++) {
  genders.push('male');
}
for (var index = 0; index < femalesCount; index++) {
  genders.push('female');
}
genders = _.shuffle(genders);

var gender;
var pictureNo;
var src;
while (gender = genders.pop()) {
  pictureNo = profiles[gender].pop();
  src = 'assets/img/' + gender + '_profile' + pictureNo + '.jpg';
  console.log(src);
}

I've tested this solution for 50K of males and 50K of females, it executes just in 115 msec. 我已经针对50K的男性和50K的女性测试了该解决方案,它的执行时间仅为115毫秒。

Try this:- 尝试这个:-

$(document).ready(function () {
        // Generate timeline items
        var timelineItemCount = Math.floor(Math.random() * 9) + 1.
            selectedPicObj={};
        for(i=0;i<timelineItemCount;i++)
        {
            generateTimeline(selectedPicObj);
        }
    });

    function generateTimeline(selectedPicObj) {
    // Select gender
    var genderArray = ['male','female'], i=0;
    var gender = genderArray[Math.floor(Math.random()*genderArray.length)]; 

    // Select profile picture - how do I prevent the same number from being selected once here
    var pictureNo = Math.floor(Math.random() * 19) + 1;
        for(;i<19;i++){
            if(!selectedPicObj[pictureNo]){
                selectedPicObj[pictureNo] = true;
                break;
            }else{
                pictureNo++;
                if(pictureNo === 19){
                    pictureNo = 0;
                }
            }
        }
    // Create timeline entry    
    $('#home-page').append($('<div class="timeline-item"><img src="assets/img/' + gender + '_profile' + pictureNo + '.jpg" alt="" class="img-rounded profile"></div>'));    
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM