JavaScript随机引用生成器

JavaScript随机引用生成器,javascript,arrays,object,Javascript,Arrays,Object,我一直在为一个类构建一个随机引号生成器,该类接受一个对象数组(引号),并基于随机数生成函数显示一个随机引号。为了获得额外的学分,课程要求我找到一种方法,使引号在再次循环引用之前只显示一次。为此,我决定尝试创建一个空数组,然后将生成的任何引号推送到该数组中,并将其从原始数组中分割出来,然后运行一个for循环,检查我的原始数组长度是否为0,如果是,则通过新数组将每个索引推回到原始数组中 我遇到的问题是,当我从原始数组拼接出索引时,它会留下一个空数组,该数组现在是循环的一部分,但未定义。该索引最终基于

我一直在为一个类构建一个随机引号生成器,该类接受一个对象数组(引号),并基于随机数生成函数显示一个随机引号。为了获得额外的学分,课程要求我找到一种方法,使引号在再次循环引用之前只显示一次。为此,我决定尝试创建一个空数组,然后将生成的任何引号推送到该数组中,并将其从原始数组中分割出来,然后运行一个for循环,检查我的原始数组长度是否为0,如果是,则通过新数组将每个索引推回到原始数组中

我遇到的问题是,当我从原始数组拼接出索引时,它会留下一个空数组,该数组现在是循环的一部分,但未定义。该索引最终基于随机生成器显示,并带来一个“未定义”错误。我没有push/splice方法的代码是-

// event listener to respond to clicks on the page
// when user clicks anywhere on the page, the "makeQuote" function is called

document.getElementById('loadQuote').addEventListener("click", printQuote, false);

//defining variables

var message = '';
var viewedquotes = [];


//print function to print the randomly selected quote to the page

function print(message) {     
        var outputDiv = document.getElementById('quote-box');
        outputDiv.innerHTML = message;
}               

//a function that creates a random number between 0 and the length of quotes to randomly select an object or index of the quotes array and return the value of it.

function getRandomQuote() {
        var quoteObject = quotes[Math.floor(Math.random() * quotes.length)];
        return quoteObject;
}


//RandomColors function to generate random RGB values and return the values


function RandomColors() {
        var red = Math.floor(Math.random() * 256);
        var green = Math.floor(Math.random() * 256);
        var blue = Math.floor(Math.random() * 256);
        var colors = 'rgb(' + red + ',' + green + ',' + blue + ')';
        return colors;
}


//Takes the random quote function stores it into var printObject and adds them to message variable as a string of paragraphs and spans.
//If citation and year are undefined it does not print them.
//Resets the message variable to be '' after for a new click to generate a new quote.  
//Uses the getRandomColors function to change the body's background color each time the button is clicked.

function printQuote() {
        var printObject = getRandomQuote();
        message += '<p class="quote">' + printObject.quote + '</p>';
        message += '<p class="source">' + printObject.source + '';
        if (printObject.citation !== undefined) {
                message += '<span class ="citation">' + printObject.citation + '</span>';
            }
        if (printObject.year !== undefined) {
                message += '<span class ="year">' + printObject.year + '</span>';
            }
        message += '</p>';
        print(message);
        message = '';
        var getRandomColors = RandomColors();
        document.body.style.backgroundColor = getRandomColors;
}
//响应页面上单击的事件侦听器
//当用户单击页面上的任意位置时,将调用“makeQuote”函数
document.getElementById('loadQuote')。addEventListener(“单击”,printQuote,false);
//定义变量
var消息=“”;
var viewedquotes=[];
//打印功能将随机选择的报价打印到页面
函数打印(消息){
var outputDiv=document.getElementById('quote-box');
outputDiv.innerHTML=消息;
}               
//一种函数,用于创建介于0和引号长度之间的随机数,以随机选择引号数组的对象或索引并返回其值。
函数getRandomQuote(){
var quoteObject=quotes[Math.floor(Math.random()*quotes.length)];
返回quoteObject;
}
//RandomColor函数生成随机RGB值并返回值
函数randomColor(){
var red=Math.floor(Math.random()*256);
var green=Math.floor(Math.random()*256);
var blue=Math.floor(Math.random()*256);
变量颜色='rgb('+红色+'、'+绿色+'、'+蓝色+');
返回颜色;
}
//获取随机引用函数,将其存储到var printObject中,并将其作为段落和跨度字符串添加到消息变量中。
//如果引用和年份未定义,则不会打印它们。
//将消息变量重置为“”后,单击以生成新报价。
//每次单击按钮时,使用getRandomColors函数更改主体的背景色。
函数printQuote(){
var printObject=getRandomQuote();
message+='

'+printObject.quote+'

'; message+='

'+printObject.source+''; if(printObject.引文!==未定义){ message+=''+printObject.引文+''; } 如果(printObject.year!==未定义){ message+=''+printObject.year+''; } 消息+='

'; 打印(信息); 信息=“”; var getrandomColor=randomColor(); document.body.style.backgroundColor=GetRandomColor; }
我在最后一个函数中尝试的拼接和推送方法如下(这是在printQuote()函数中的message=''行之后-

var pushQuote = viewedquotes.push(printObject);
                console.log(viewedquotes);
                var indexOfQuote = indexOf(printObject);
                var spliceQuote = quotes.splice(indexOfQuote,1);
                var quotesLength = quotes.length;
                console.log(quotes);
                if (quotesLength === 0) {
                    for (i = 0; i <= viewedquotes ; i++) {
                        quotes.push(viewedquotes[i]);

                    }
            viewedquotes= [];
                }
var pushQuote=viewedquotes.push(printObject);
console.log(viewedquotes);
var indexOfQuote=indexOf(打印对象);
var-spliceQuote=quotes.splice(indexOfQuote,1);
var quotesLength=quotes.length;
console.log(引号);
如果(quotesLength==0){

对于(i=0;i您可以调整方法,从quote数组拼接一个随机索引,然后将其推到第二个数组的堆栈顶部。例如:

var quotes1 = ["q1", "q2", "q3", "q4", "q5"];
var quotes2 = []; //<==empty array

var indexToSplice = Math.floor(Math.random() * quotes1.length);
var spliceQuote = quotes1.splice(indexToSplice, 1);
print(spliceQuote);
quotes2.push(spliceQuote);

我在那里测试了它。

您需要针对
for
循环中的数组长度进行循环:
viewedquotes.length
(否则它将永远循环)。另外,
pushQuote
返回一个整数,而不是您要推的项目。哇,我不敢相信它这么简单,它就在我眼前。感谢您的简单帮助/调整,而不是完全不同的方法。很高兴看到我走的是正确的路径/逻辑。@brokenings不客气。请不要忘记将其标记为答案和/或投票:谢谢!
if (quotes1.length == 0) {
    quotes1 = quotes2;
    quotes2 = [];
}