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];
}

它首先随机选择单词的长度,然后从该长度的单词列表中选择其中一个单词。正如 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 的算法一起工作(我对它做了两个小修复,并用他们更新了这个答案。)你说的对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只是一个虚拟函数,一旦单词到位,它就会被覆盖。

但是我仍然想知道,如果您只打算使用它来加载一个单词,为什么还要费心将整个列表发送给客户端。

于 2013-07-13T18:16:09.193 回答