1

さて、問題は次のとおりです。

日本語の単語とその定義のリストを作成することで、日本語をより簡単に学習するために、このウェブサイトを作成しました。私は、lesson1.txt に日本語の単語を入れ、lesson1answers.txt に答えを同じ順序で入れました。それらをphpで読み込んで、javascriptの配列に入れました。

問題は、サイトを起動するたびにこれらの配列が同じ順序になっていることです。これは、答えのスポットに似ているため、非常に迷惑であり、日本語の単語を読むことさえできません (私たちの人間の脳をくそー!) . したがって、これを解決する最善の方法は、両方の配列の要素をランダム化することだと考えましたが、両方を同じパターンでランダム化する必要があります。そうしないと、質問が答えに正しく対応しなくなります。

私が持っている配列の 1 つは多次元です。配列には、まず、.txt ファイルから読み取った行を表す要素が保持されます。行には複数の文字が含まれているため、配列の 2 番目の要素は各文字を表します (なぜこれを行ったのかは聞かないでください。PHP で日本語の文字を読み取って直接 js に入れることができなかったためです) . 他の配列は、私が答えを保持している配列です。

だから私は AnswersArray(); を持っています。および JapaneseCharactersArray();

私はこの問題に丸一日立ち往生しています.誰かが助けてくれるか、ヒントを教えてください..

4

2 に答える 2

3

それらをオブジェクトの 1 つの配列にマージする必要があります。

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

これで配列は 1 つだけになり、各項目には 1 つの単語に関するすべての情報が含まれています。これで簡単にシャッフルできます。

あなたの代わりに、コードのさらに下をAnswersArray[x]使用します。array[x].answer


もちろん、fisherYates同じ方法で 2 つ以上の配列をシャッフルするように関数を適応させることもできます。

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 に答える