我有一个保存为 words.json 的文件,它是一个很大的单词列表,按字母顺序和长度排序。
它们的结构如下:
{"3":["ace","act","add","ado","ads"], "4":[...], ...}
(为简洁起见,我添加了省略号)
如何将 JSON 加载到页面并在列表中选择一个随机单词?我需要 jQuery 吗?我的功能应该是什么样的?
谢谢!
我有一个保存为 words.json 的文件,它是一个很大的单词列表,按字母顺序和长度排序。
它们的结构如下:
{"3":["ace","act","add","ado","ads"], "4":[...], ...}
(为简洁起见,我添加了省略号)
如何将 JSON 加载到页面并在列表中选择一个随机单词?我需要 jQuery 吗?我的功能应该是什么样的?
谢谢!
你可以这样做:
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 字符串。
我能够让它与 Mash 的算法一起工作(我对它做了两个小修复,并用他们更新了这个答案。)你说的对JSON.parse
jQuery 的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
只是一个虚拟函数,一旦单词到位,它就会被覆盖。
但是我仍然想知道,如果您只打算使用它来加载一个单词,为什么还要费心将整个列表发送给客户端。