1

好吧,事情就是这样;

现在我为自己制作了这个网站,通过列出日语单词及其定义来更轻松地学习日语。我把日文单词放在第1课.txt中,把答案放在第1课.txt中以相同的顺序。我用 php 把它们读出来,然后用 javascript 把它们放在数组中。

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

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

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

我已经被这个问题困扰了一整天了,请有人帮忙或给点提示..

4

2 回答 2

3

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

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

现在你只有一个数组,每一项都包含一个单词的所有信息。您现在可以轻松随机播放

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);
于 2012-07-19T22:38:33.380 回答
0

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

然后像这样循环遍历该新数组:

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

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

于 2012-07-19T22:40:24.073 回答