随机播放一个Questions数组和一个Answers多维数组

时间:2012-07-19 22:30:41

标签: javascript arrays

好吧,事情就是这样;

现在我通过列出日语单词及其定义,让我自己更容易学习日语。我把日语单词放在lesson1.txt中,将school1answers.txt中的答案放在同一顺序中。我在php中读出它们并将它们放在javascript中的数组中。

现在的问题是,每次我启动网站时这些数组都有相同的顺序,这对我来说非常烦人,因为我一直在寻找答案的地方,我甚至不读日语单词(该死的我的人类)大脑!)。所以我认为解决这个问题的最好方法是随机化两个数组的元素,但它们都必须以相同的模式随机化,因为否则问题就不再正确对应答案了。

我拥有的其中一个数组是多维的。该数组首先保存表示我从.txt文件中读出的行的元素。该行中有多个字符,因此数组的第二个元素代表每个字符(不要问我为什么这样做,它与我无法读取php中的日文字符并直接将它们放入js中) 。另一个数组就是我保留答案的数组。

所以我有AnswersArray();和JapaneseCharactersArray();

我一直坚持这个问题整整一天,有人请帮忙或暗示......

2 个答案:

答案 0 :(得分:3)

您应该将它们合并到一个对象数组中:

// assuming AnswersArray.length == JapaneseCharactersArray.length
var array = [];
for (var i=0; i<AnswersArray.length; i++)
    array[i] = {
       answer: AnswersArray[i],
       japanese: JapaneseCharactersArray[i]
    };

现在您只有一个数组,每个项目包含一个单词的所有信息。您现在可以轻松shuffle

而不是AnswersArray[x],您可以在代码中进一步使用array[x].answer


当然,你可以调整你的fisherYates函数来以相同的方式改组两个或多个数组:

function fisherYates(first/*, ... arrays */) {
    var i = first.length,
        argl = arguments.length;
    if (i == 0) return false;
    while (--i) {
        var r = Math.floor(Math.random() * (i + 1));
        for (var j=0; j<argl; j++) {
            var tempi = arguments[j][i];
            var tempj = arguments[j][r];
            arguments[j][i] = tempj;
            arguments[j][r] = tempi;
        }
    }
}

// usage:
> fisherYates(AnswersArray, JapaneseCharactersArray);

答案 1 :(得分:0)

尽管最佳方式可能只是将它们创建为单个数组,但另一种方法是创建一个与其他数组长度相同的新数组,其中数组中的每个项目都是数量:1,2,3 ...... n。但不是按顺序排列数字,而是使用Math.random()随机化他们的顺序。

然后循环遍历这个新数组:

for(i=0; i<AnswersArray.length; i++) {
    AnswersArray[RandomArray[i]]; // whatever
}

另一种方法是在随机化数组时交换整行。