我的申请目标很简单:
在创建对象时,我的目标是从该对象中获取一个随机单词,例如:
outputObj[randNum].word
哪个应该返回我在randNum参数中设置的索引处的单词以及存储在其word属性中的值。
我感到困惑,并尝试了一切我能想到的结果。
这是我目前的JS:
var fs = require('fs),
getWordFromRandomNumber = function(randNum) {
var output = fs.readFileSync('../dictionary/dictionary.txt', 'utf8')
.trim()
.split('\r\n')
.map(line => line.split('\r\n'))
.reduce(function(outputObj, line){
outputObj[line] = outputObj[line] || [];
outputObj[line].push({
word: line,
});
return outputObj[randNum].word;
}, {});
console.log(JSON.stringify(output, null, 2));
}
getWordFromRandomNumber(25);
我希望这会返回给我outputObj [25] .word的值,但我得到的只是整个文件的级联,请参阅此处(注意我使用我的cmd运行文件使用babel和节点与命令" babel wordGenerator.js | node":
任何帮助都会非常感激,因为我现在完全没有想法。
谢谢, SD
答案 0 :(得分:0)
如果文件确实包含新行中的所有单词(您的输出显示其他内容),那么以下内容就足够了:
var output = fs.readFileSync('../dictionary/dictionary.txt', 'utf8')
.trim() // to remove whitespace
.split('\r') // creates array with individual words
.map(item => { return { word :item } }); // creates array with objects
return output[randNum % output.length].word;
无需减少或创建另一个对象。
此代码应与有效输入一起使用,其中单词由'\ r'分隔。输出建议单词由'\ r \ n'或'\ r \'分隔。这会创建带有'\ r'的单词。如果你想要没有'\ r'的单词,你应该应用一些正则表达式来刷新它。也许改成.split(/\r\n|\r|\n/g);
就行了。
PS:%部分是为了确保如果randNum输入大于数组长度,则不会得到错误输出。数组是在函数内部创建的,因此在调用时,仍然不清楚实际最大有效数是多少。
答案 1 :(得分:0)
可能的一种解决方案:
var str = " line_0\r\nline_1\r\nline_2\r\nline_3\r\nline_4\r\nline_5\r\nline_6\r\nline_7\r\nline_8\r\nline_9\r\nline_10\r\nline_11\r\nline_12\r\nline_13\r\nline_14\r\nline_15\r\nline_16\r\nline_17\r\nline_18\r\nline_19\r\nline_20\r\nline_21\r\nline_22\r\nline_23\r\nline_24\r\nline_25\r\nline_26\r\nline_27\r\nline_28\r\nline_29\r\nline_30\r\nline_31\r\nline_32\r\nline_33\r\nline_34\r\nline_35\r\nline_36\r\nline_37\r\nline_38\r\nline_39\r\nline_40\r\nline_41\r\nline_42\r\nline_43\r\nline_44\r\nline_45\r\nline_46\r\nline_47\r\nline_48\r\nline_49\r\nline_50\r\nline_51\r\nline_52\r\nline_53\r\nline_54\r\nline_55\r\nline_56\r\nline_57\r\nline_58\r\nline_59\r\nline_60\r\nline_61\r\nline_62\r\nline_63\r\nline_64\r\nline_65\r\nline_66\r\nline_67\r\nline_68\r\nline_69\r\nline_70\r\nline_71\r\nline_72\r\nline_73\r\nline_74\r\nline_75\r\nline_76\r\nline_77\r\nline_78\r\nline_79\r\nline_80\r\nline_81\r\nline_82\r\nline_83\r\nline_84\r\nline_85\r\nline_86\r\nline_87\r\nline_88\r\nline_89\r\nline_90\r\nline_91\r\nline_92\r\nline_93\r\nline_94\r\nline_95\r\nline_96\r\nline_97\r\nline_98\r\nline_99 ";
var arr = str
.trim()
.split("\r\n")
.map(function(value , index){
return { index: index , word : value};
});
var len = arr.length;
var randNum = Math.floor(Math.random() * len);
var result = arr[ randNum ].word;
document.body.innerHTML+= '<br> randNum = ' + randNum + ' result : ' + result ;
Just click run again and again . . .
所以你的代码变成了:
var fs = require('fs),
getWordFromRandomNumber = function(randNum) {
var output = fs.readFileSync('../dictionary/dictionary.txt', 'utf8')
.trim()
.split('\r\n')
.map( val => { return { word : val }; });
console.log(JSON.stringify(output, null, 2));
return output[ randNum ].word;
};
getWordFromRandomNumber(25);
请注意,每次拨打getWordFromRandomNumber
时,您都会阅读字典文件,将其拆分,映射!
如果您的字典是静态的,那么您可以“缓存”过程的结果!
var fs = require('fs),
cached = null ,
getWordFromRandomNumber = function(randNum) {
if(cached) return cached[ randNum ].word;
var output = fs.readFileSync('../dictionary/dictionary.txt', 'utf8')
.trim()
.split('\r\n')
.map( val => { return { word : val }; });
console.log(JSON.stringify(output, null, 2));
cached = output;
return output[ randNum ].word;
};
getWordFromRandomNumber(25);
答案 2 :(得分:0)
我的应用程序现在运行正常,问题通过使用ajax而不是节点fs来解决。
现在我有了这个:
var getDictionaryFile = function(file) {
var xhr = new XMLHttpRequest();
xhr.open("GET", file, false);
xhr.send(null);
var returnValue = xhr.responseText;
return returnValue;
},
getWordFromRandomNumber = function(randNum, el) {
var target = document.querySelectorAll(el),
output = getDictionaryFile("../dictionary/dictionary.txt")
.trim()
.split('\r\n');
[].forEach.call(output, function(line) {
if(output[randNum % output.length - 1] == line ){
[].forEach.call(target, function(element) {
element.innerHTML = line;
});
}
});
}
响应文本与最后一个代码做同样的事情,除了工作,即:被读取,拆分成数组,循环然后我想要的索引由随机数决定。因此,我按预期得到每个请求的随机字。