麻烦将文件转换为数组然后输出对象值

时间:2015-10-28 22:28:09

标签: javascript node.js

我的申请目标很简单:

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

在创建对象时,我的目标是从该对象中获取一个随机单词,例如:

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":

enter image description here

任何帮助都会非常感激,因为我现在完全没有想法。

谢谢, SD

3 个答案:

答案 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;
                });
            }
        });

    }

响应文本与最后一个代码做同样的事情,除了工作,即:被读取,拆分成数组,循环然后我想要的索引由随机数决定。因此,我按预期得到每个请求的随机字。