将文件转换为数组然后输出对象值时出现问题

我的应用程序的目标很简单:

  • 接受一个随机数字参数
  • 阅读dictionary.txt文件
  • 将该文件转换成一个数组,每个单词在文件中(每个单词在文件中的新行)
  • 将创build的每个数组项目推送到一个对象中,然后将其自身作为一个字属性

在创build这个对象的时候,我的目标是从这个对象中得到一个随机的单词,例如:

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和节点的命令“巴别wordGenerator.js |节点“:

在这里输入图像说明

任何帮助,将不胜感激,因为我现在都没有想法。

谢谢,SD

如果文件在新行上确实包含了所有的单词(输出build议了其他内容),那么以下内容就足够了:

 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; 

无需减less或创build另一个对象。

这个代码应该与有效的input一起工作,其中单词由'\ r'分隔。 输出build议词用'\ r \ n'或'\ r'分隔。 这用'\ r'创build单词。 如果你想要没有'\ r'的单词,你应该使用一些正则expression式来清除。 也许改成.split(/\r\n|\r|\n/g); 会做的伎俩。

PS:%部分是为了确保如果randNuminput大于数组长度,则不会得到错误输出。 数组是在函数内部创build的,因此在调用的时候,实际上最大的有效数字还不清楚。

一个解决scheme可能

 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 . . . 

我的应用程序工作完美了,问题是通过使用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; }); } }); } 

而且响应文本和最后一个代码做的是一样的,除了工作之外,也就是读取,拆分成数组,然后循环,然后我想要的索引由一个随机数决定。 因此,如预期的那样,我得到每个请求的随机词。