node.js:readLine但最后一行没有保存在数组中

时间:2017-10-10 15:06:47

标签: javascript node.js

使用:Node.js 8.x

目的:读取标准输入并将其存储在数组中

错误:最后一行没有保存在数组中。

我对javascript的误解是什么?异步和同步?

const promise = require('promise')
,   readline = require('readline');

const stdRl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  terminal: false
});

GLOBAL_COUNTER_READLINE = 0;
GLOBAL_MAPSIZE = 0;
GLOBAL_MAPDATA = [];

stdRl.on('line', (input) => {

  // first line : setMapSize
  // second line ~ GLOBAL_MAPSIZE : appendMapDataRow
  // GLOBAL_MAPSIZE + 1 line : getMapData, countChar
  if (GLOBAL_COUNTER_READLINE == 0) {

    // setMapSize;
    GLOBAL_MAPSIZE = input;

    console.log(`Map Size is : ${GLOBAL_MAPSIZE}`);

  } else if (GLOBAL_COUNTER_READLINE != GLOBAL_MAPSIZE) {

    // appendMapDataRow
    GLOBAL_MAPDATA.push(input);

  } else if(GLOBAL_COUNTER_READLINE == GLOBAL_MAPSIZE){

    //getMapData
    for (var row = 0; row < GLOBAL_MAPDATA.length; row++) {
      console.log(`${GLOBAL_MAPDATA[row]}`);
    }

    stdRl.close();
  }
  GLOBAL_COUNTER_READLINE++;
});

javascript太棒了,但对我来说很难。

1 个答案:

答案 0 :(得分:3)

您的主要问题是,由于行数是您阅读的第一个值,因此您不应该实际递增计数器。一旦实际收到第一行数据,就应该开始递增。

if (GLOBAL_MAPSIZE == 0) {

  GLOBAL_MAPSIZE = input;
  console.log(`Map Size is : ${GLOBAL_MAPSIZE}`);

} else if (GLOBAL_COUNTER_READLINE < GLOBAL_MAPSIZE) {

  GLOBAL_MAPDATA.push(input);
  GLOBAL_COUNTER_READLINE++; // <-- move the increment here

} else {

  for (var row = 0; row < GLOBAL_MAPDATA.length; row++) {
    console.log(`${GLOBAL_MAPDATA[row]}`);
  }

  stdRl.close();
}

另一个潜在的未来问题是您实例化对象,但将它们用作原始值。

Number的两个实例永远不会相等:

&#13;
&#13;
console.log(
  new Number(0) == new Number(0) // false
)
&#13;
&#13;
&#13;

因为对象是通过引用相等性进行比较的(基本上检查它们是否是同一个实例;如果它们引用内存中的同一个对象)。

您可以比较他们的值:

&#13;
&#13;
console.log(
  new Number(0).valueOf() == new Number(0).valueOf() // true
)
&#13;
&#13;
&#13;

但是使用原始原语要简单得多。

&#13;
&#13;
console.log(
  0 == 0 // true
)
&#13;
&#13;
&#13;

所以在你的代码中:

GLOBAL_COUNTER_READLINE = 0;
GLOBAL_MAPSIZE = 0;
GLOBAL_MAPDATA = [];