从 json 文件中获取随机词及其参数
Get random word and its parameters from json file
我正在尝试从 JSON 文件中获取随机词及其参数。
JSON 文件:
{
ranWord1 {
sentence: "This is a sentence 1"
},
ranWord2 {
sentence: "This is a sentence 2"
},
ranWord3 {
sentence: "This is a sentence 3"
},
ranWord4 {
sentence: "This is a sentence 4"
},
ranWord5 {
sentence: "This is a sentence 5"
}
}
JS:
function readFiles() {
var result = null;
var file = 'dictionary.json';
$.ajax({
url: file,
type: 'get',
dataType: 'json',
async: false,
success: function(data) {
result = data;
}
});
var lines = result.split(", ");
var randLineNum = Math.floor(Math.random() * lines.length);
return lines[randLineNum];
}
我能够得到随机词,在这种情况下是 ranWord1
、ranWord2
、ranWord3
、ranWord4
、ranWord5
。但是,我无法获取参数。例如,我想将 "This is a sentence 4"
存储在局部变量中。任何帮助将不胜感激!
更新:
外部 word.js 文件:
var data = [
["ranWord1", "This is a sentence 1"],
["ranWord2", "This is a sentence 2"],
["ranWord3", "This is a sentence 3"],
["ranWord4", "This is a sentence 4"],
["ranWord5", "This is a sentence 5"]
]
JS:
function readFiles() {
var result = null;
var file = 'word.js';
$.ajax({
url: file,
type: 'get',
data: 'data',
dataType: 'script',
async: false,
success: function(data) {
var randomData = data[Math.floor(Math.random() * data.length)];
result = randomData;
alert("word: " + randomData[0] + ", sentence: " + randomData[1]);
}
});
}
我正在尝试从外部文件获取数组,但现在我得到的是 undefined
for randomData[1],我得到的任何东西包括 [
和 ]
for word
这应该可以完成工作。
- 等待 json 响应
- 获取对象大小
- 创建一个随机数
- 使用随机数使 var randomSentence 成为对象句子
````
var randomSentence = '';
function readFiles() {
var result = null;
var file = 'dictionary.json';
$.ajax({
url: file,
type: 'get',
dataType: 'json',
async: false,
success: function(data) {
jsonSize = getObjectSize(data);
randNum = Math.floor(Math.random() * jsonSize);
randomSentence = data[randNum].sentence;
}
});
}
function getObjectSize(obj){
var size = 0, key;
for (key in obj) {
if (obj.hasOwnProperty(key)) size++;
}
return size;
}
理想情况下,您应该在 success 函数的末尾进行函数调用,并将随机句子的结果传递给它,而不是使用全局变量。
除了@AndyKillen 已解决的 ajax 问题外,您的 JSON 无效。您可以使用http://jsonlint.com/来检查。
这将是有效的 JSON。
{
"ranWord1": {
"sentence": "This is a sentence 1"
},
"ranWord2": {
"sentence": "This is a sentence 2"
},
"ranWord3": {
"sentence": "This is a sentence 3"
},
"ranWord4": {
"sentence": "This is a sentence 4"
},
"ranWord5": {
"sentence": "This is a sentence 5"
}
}
此外,在您的情况下,您甚至不需要这么复杂的 json。一个简单的数组就足够了:
[
"This is a sentence 1",
"This is a sentence 2",
"This is a sentence 3",
"This is a sentence 4",
"This is a sentence 5"
]
(除非你需要一些额外的数据)
这也将简化您的 javascript 代码。你可以这样做:
$.ajax({
url: file,
type: 'get',
dataType: 'json',
async: false,
success: function(data) {
var randomSentence = data[Math.floor(Math.random()*data.length)];
}
});
如果你需要这个词你也可以这样做:
var data = [
["word1", "This is a sentence 1"],
["word2", "This is a sentence 2"],
["word3", "This is a sentence 3"],
["word4", "This is a sentence 4"],
["word5", "This is a sentence 5"]
]
var randomData = data[Math.floor(Math.random() * data.length)];
alert("word: " + randomData[0] + ", sentence: " + randomData[1]);
尝试
var json = {
"ranWord1": {
"sentence": "This is a sentence 1"
},
"ranWord2": {
"sentence": "This is a sentence 2"
},
"ranWord3": {
"sentence": "This is a sentence 3"
},
"ranWord4": {
"sentence": "This is a sentence 4"
},
"ranWord5": {
"sentence": "This is a sentence 5"
}
};
function readFiles() {
var file = '/echo/json/';
var request = $.ajax({
url: file,
type: 'POST',
dataType: 'json',
data: {json:JSON.stringify(json)},
async: false
});
return request.then(function(data) {
var keys = Object.keys(data);
var sentences = $.map(data, function(rand, key) {
return rand.sentence
});
return [data, keys, sentences]
}, function(jqxhr, textStatus, errorThrown) {
return errorThrown
})
}
readFiles()
.then(function(response) {
console.log(response); // `response[0]`:`json`
var keys = response[1];
var sentences = response[2]
// do stuff with `keys`:"words" , `sentences`:"sentences"
console.log(keys, sentences);
// var lines = result.split(", ");
var randLineNum = Math.floor(Math.random() * keys.length);
console.log(keys[randLineNum]
, response[0][keys[randLineNum]]["sentence"]);
return keys[randLineNum]
+":"+ response[0][keys[randLineNum]]["sentence"];
}, function(errorThrown) {
console.log(errorThrown)
});
jsfiddle http://jsfiddle.net/j4141k6a/1/
我正在尝试从 JSON 文件中获取随机词及其参数。
JSON 文件:
{
ranWord1 {
sentence: "This is a sentence 1"
},
ranWord2 {
sentence: "This is a sentence 2"
},
ranWord3 {
sentence: "This is a sentence 3"
},
ranWord4 {
sentence: "This is a sentence 4"
},
ranWord5 {
sentence: "This is a sentence 5"
}
}
JS:
function readFiles() {
var result = null;
var file = 'dictionary.json';
$.ajax({
url: file,
type: 'get',
dataType: 'json',
async: false,
success: function(data) {
result = data;
}
});
var lines = result.split(", ");
var randLineNum = Math.floor(Math.random() * lines.length);
return lines[randLineNum];
}
我能够得到随机词,在这种情况下是 ranWord1
、ranWord2
、ranWord3
、ranWord4
、ranWord5
。但是,我无法获取参数。例如,我想将 "This is a sentence 4"
存储在局部变量中。任何帮助将不胜感激!
更新:
外部 word.js 文件:
var data = [
["ranWord1", "This is a sentence 1"],
["ranWord2", "This is a sentence 2"],
["ranWord3", "This is a sentence 3"],
["ranWord4", "This is a sentence 4"],
["ranWord5", "This is a sentence 5"]
]
JS:
function readFiles() {
var result = null;
var file = 'word.js';
$.ajax({
url: file,
type: 'get',
data: 'data',
dataType: 'script',
async: false,
success: function(data) {
var randomData = data[Math.floor(Math.random() * data.length)];
result = randomData;
alert("word: " + randomData[0] + ", sentence: " + randomData[1]);
}
});
}
我正在尝试从外部文件获取数组,但现在我得到的是 undefined
for randomData[1],我得到的任何东西包括 [
和 ]
for word
这应该可以完成工作。
- 等待 json 响应
- 获取对象大小
- 创建一个随机数
- 使用随机数使 var randomSentence 成为对象句子
````
var randomSentence = '';
function readFiles() {
var result = null;
var file = 'dictionary.json';
$.ajax({
url: file,
type: 'get',
dataType: 'json',
async: false,
success: function(data) {
jsonSize = getObjectSize(data);
randNum = Math.floor(Math.random() * jsonSize);
randomSentence = data[randNum].sentence;
}
});
}
function getObjectSize(obj){
var size = 0, key;
for (key in obj) {
if (obj.hasOwnProperty(key)) size++;
}
return size;
}
理想情况下,您应该在 success 函数的末尾进行函数调用,并将随机句子的结果传递给它,而不是使用全局变量。
除了@AndyKillen 已解决的 ajax 问题外,您的 JSON 无效。您可以使用http://jsonlint.com/来检查。
这将是有效的 JSON。
{
"ranWord1": {
"sentence": "This is a sentence 1"
},
"ranWord2": {
"sentence": "This is a sentence 2"
},
"ranWord3": {
"sentence": "This is a sentence 3"
},
"ranWord4": {
"sentence": "This is a sentence 4"
},
"ranWord5": {
"sentence": "This is a sentence 5"
}
}
此外,在您的情况下,您甚至不需要这么复杂的 json。一个简单的数组就足够了:
[
"This is a sentence 1",
"This is a sentence 2",
"This is a sentence 3",
"This is a sentence 4",
"This is a sentence 5"
]
(除非你需要一些额外的数据) 这也将简化您的 javascript 代码。你可以这样做:
$.ajax({
url: file,
type: 'get',
dataType: 'json',
async: false,
success: function(data) {
var randomSentence = data[Math.floor(Math.random()*data.length)];
}
});
如果你需要这个词你也可以这样做:
var data = [
["word1", "This is a sentence 1"],
["word2", "This is a sentence 2"],
["word3", "This is a sentence 3"],
["word4", "This is a sentence 4"],
["word5", "This is a sentence 5"]
]
var randomData = data[Math.floor(Math.random() * data.length)];
alert("word: " + randomData[0] + ", sentence: " + randomData[1]);
尝试
var json = {
"ranWord1": {
"sentence": "This is a sentence 1"
},
"ranWord2": {
"sentence": "This is a sentence 2"
},
"ranWord3": {
"sentence": "This is a sentence 3"
},
"ranWord4": {
"sentence": "This is a sentence 4"
},
"ranWord5": {
"sentence": "This is a sentence 5"
}
};
function readFiles() {
var file = '/echo/json/';
var request = $.ajax({
url: file,
type: 'POST',
dataType: 'json',
data: {json:JSON.stringify(json)},
async: false
});
return request.then(function(data) {
var keys = Object.keys(data);
var sentences = $.map(data, function(rand, key) {
return rand.sentence
});
return [data, keys, sentences]
}, function(jqxhr, textStatus, errorThrown) {
return errorThrown
})
}
readFiles()
.then(function(response) {
console.log(response); // `response[0]`:`json`
var keys = response[1];
var sentences = response[2]
// do stuff with `keys`:"words" , `sentences`:"sentences"
console.log(keys, sentences);
// var lines = result.split(", ");
var randLineNum = Math.floor(Math.random() * keys.length);
console.log(keys[randLineNum]
, response[0][keys[randLineNum]]["sentence"]);
return keys[randLineNum]
+":"+ response[0][keys[randLineNum]]["sentence"];
}, function(errorThrown) {
console.log(errorThrown)
});
jsfiddle http://jsfiddle.net/j4141k6a/1/