0

アルファベット順および長さ順に並べられた単語の大きなリストであるwords.jsonとして保存したファイルがあります。

それらは次のように構成されています。

{"3":["ace","act","add","ado","ads"], "4":[...], ...}

(簡潔にするために、省略記号を追加しました)

JSON をページにロードして、リストからランダムな単語を選択するにはどうすればよいですか? jQuery は必要ですか? 私の機能はどのように見えるべきですか?

ありがとうございました!

4

2 に答える 2

4

次のようなことができます。

function getRandomWord(jsonStringListOfWords) {
    var words = JSON.parse(jsonListOfWords);

    var MAX_LENGTH = Object.keys(words).length;
    var wordLength = Math.floor(Math.random() * MAX_LENGTH) + 1;
    var wordIndex = Math.floor(Math.random() * words[wordLength].length) + 1;

    return words[wordLength][wordIndex];
}

最初に単語の長さをランダムに選択し、次にその長さの単語のリストからそれらの単語の 1 つを選択します。これは、ScottSauyet がコメントで指摘したように、さまざまな長さのすべての単語間で均等に分散されるわけではありません。

長さに関係なく、すべての単語を均等に分配するアルゴリズムの例を次に示します。

function getRandomWordEvenDistribution(jsonStringListOfWords) {
    var words = JSON.parse(jsonListOfWords);

    var numWords = 0;
    for (var x in words) {
        numWords += words[x].length;
    }

    var wordIndex = Math.floor(Math.random() * numWords);

    for (var x in words) {
        if (wordIndex >= words[x].length) {
            wordIndex -= words[x].length;
        } else {
            return words[x][wordIndex];
        }
    }
}

実際に JSON をロードする限り、jQuery を使用する場合は$.getJSON()、サーバーから JSON 文字列を取得するために使用できる という非常に便利なメソッドがあります。

于 2013-07-13T15:56:24.347 に答える
1

私はそれをMashのアルゴリズムで動作させることができました(私はそれに2つのマイナーな修正を加え、その答えをそれらで更新しました.)JSON.parsejQueryのgetJSON. JSBin で実行されています:

var words = (function() {
    var wordList, numWords;

    return  {
        load: function(data) {
            wordList = data;
            numWords = 0;
            for (var x in wordList) {
                numWords += wordList[x].length;
            }
            words.random = function() {
                var wordIndex = Math.floor(Math.random() * numWords);
                console.log(wordIndex);

                for (var x in wordList) {
                    if (wordIndex >= wordList[x].length) {
                        wordIndex -= wordList[x].length;
                    } else {
                        return wordList[x][wordIndex];
                    }
                }
            };
        },
        random: function() {
            return undefined; // or throw exception?  // not initialized yet
        }
    };
}());
var print = (function() {
    var $console = $("#console");
    return function(msg) {
        $console.text($console.text() + "\n" + msg);
    };
}());

$("#random").click(function() {
    print("Random word: " + words.random());
});

print("Random word before load: " + words.random());

$.getJSON("http://jsbin.com/ukaxec/2/js")
    .then(words.load)
    .then(function() {print("Random word after load: " + words.random());});

$.getJSON()呼び出しは、JSBin でホストされている、例の最小限の拡張である単語の小さなリストを呼び出しているだけです。

JSON が正常にロードされる前は、関数words.randomは単なるダミー関数であり、単語が配置されるとオーバーライドされることに注意してください。

しかし、これを使用して 1 つの単語をロードするだけなら、わざわざリスト全体をクライアントに送信する必要があるのではないかと思います。

于 2013-07-13T18:16:09.193 に答える