如何加入/拆分实际上是一个对象的对象

时间:2018-02-24 14:01:53

标签: javascript node.js

var ipRegex = require('ip-port-regex');
...
for(var i = 0; i < orgArrayWithHostsAndPorts.length; i++) {
   ipPort = ipRegex.parts(orgArrayWithHostsAndPorts[i]);
   console.log(ipPort);
   /* 
     Gives long listing
     { ip: 'firstip', port: 'firstport' }
     { ip: 'secondip', port: 'secondport' }
    */
   fs.writeFileSync('/tmp/test.json', JSON.stringify(ipPort, null, 2), 'utf-8');
}

所以当我fs.writeFileSync时,我只看到第一个对象。我真正想要的是将每个ip / port保存为数组中单独对象的集合。我无法将,添加到每个对象

2 个答案:

答案 0 :(得分:3)

fs.writeFileSync方法将在每次调用时覆盖该文件。由于您为列表中的每个项目调用一次,因此文件中只会同时存在一个项目。

此外,使用fs.appendFileSync会写出使文件看起来像的所有对象:

{ "ip": "firstip", "port": "firstport" }
{ "ip": "secondip", "port": "secondport" }

但这不是有效的.json。对象必须包含在数组中并用逗号分隔:

[
    { "ip": "firstip", "port": "firstport" },
    { "ip": "secondip", "port": "secondport" }
]

我能想到获得所需结果的最简单方法是将数据映射到新数组,然后将该数组写入文件:

ipPorts = orgArrayWithHostsAndPorts.map( data => ipRegex.parts(data));
fs.writeFileSync('/tmp/test.json', JSON.stringify(ipPorts, null, 2), 'utf-8');

答案 1 :(得分:0)

文件在写入模式下打开,因此您将在每次执行for循环时覆盖。更好的方法是以附加模式打开文件并编写内容。 看How to append to a file in Node?