【问题标题】:Why isn't this for loop writing each element to a file?为什么这个 for 循环不将每个元素写入文件?
【发布时间】:2026-02-05 13:50:01
【问题描述】:

这是我的代码:

var data = require('./campSample.json');
var dataArray = data.resultset.result;
var fs = require('fs');


for(var i = 0; i < dataArray.length; i++){
    fs.writeFile("./campList", dataArray[i]["-facilityName"], function (err) {
        if(err){
            return console.log(err);
        }
    });
}

我试图让 for 循环遍历数组中的每个项目,获取设施名称,并将设施名称写入文件。当我运行上面的代码时,它只写数组中第一项的设施名称。有一个更好的方法吗?我正在使用的 campSample.json 只是一个示例。我想使用的实际数组中有大约 4000 个项目。这是campSample.json的内容:

{
  "resultset": {
    "-count": "4904",
    "-resultType": "campgrounds",
    "result": [
      {
        "-availabilityStatus": "N",
        "-contractID": "GA",
        "-contractType": "STATE",
        "-facilityID": "530145",
        "-facilityName": "A. H. STEPHENS STATE HISTORIC PARK",
        "-faciltyPhoto": "/webphotos/GA/pid530145/0/80x53.jpg",
        "-latitude": "33.5633333",
        "-longitude": "-82.8966667",
        "-shortName": "C145",
        "-sitesWithAmps": "Y",
        "-sitesWithPetsAllowed": "Y",
        "-sitesWithSewerHookup": "N",
        "-sitesWithWaterHookup": "Y",
        "-state": "GA"
      },
      {
        "-availabilityStatus": "N",
        "-contractID": "OH",
        "-contractType": "STATE",
        "-facilityID": "960023",
        "-facilityName": "A.W. MARION STATE PARK",
        "-faciltyPhoto": "/webphotos/OH/pid960023/0/80x53.jpg",
        "-latitude": "39.6336111",
        "-longitude": "-82.8747222",
        "-shortName": "P023",
        "-sitesWithAmps": "Y",
        "-sitesWithPetsAllowed": "Y",
        "-sitesWithSewerHookup": "N",
        "-sitesWithWaterHookup": "N",
        "-state": "OH"
      },
      {
        "-availabilityStatus": "N",
        "-contractID": "NRSO",
        "-contractType": "FEDERAL",
        "-facilityID": "72346",
        "-facilityName": "ACKER ROCK LOOKOUT",
        "-faciltyPhoto": "/webphotos/NRSO/pid72346/0/80x53.jpg",
        "-latitude": "43.0523056",
        "-longitude": "-122.6456111",
        "-shortName": "ARCL",
        "-sitesWithAmps": "N",
        "-sitesWithPetsAllowed": "Y",
        "-sitesWithSewerHookup": "N",
        "-sitesWithWaterHookup": "N",
        "-state": "OR"
      }
    ]
  }
}

【问题讨论】:

  • 你能告诉我们这个文件"./campList"的预期结果吗?
  • 只连接一次stringfs.writeFile 怎么样?
  • 对于上述 json 样本,预期输出如下:A. H. STEPHENS STATE HISTORIC PARK A.W. MARION STATE PARK ACKER ROCK LOOKOUTTE HISTORIC PARK 但是现在我看到了顺序,当前的代码实际上只是写了第三项的设施名称,Acker Rock...
  • 不要return console.log(err)。您所做的只是返回undefined。只需记录错误即可。如果要将 writeFile 用作异步操作,请确保每个文件名都是唯一的。

标签: javascript arrays json for-loop


【解决方案1】:

您应该事先收集所有名称,然后将所有名称写入./campList,只需一个 IO 请求即可。

var names = dataArray.map(function(result) {
  return result["-facilityName"];
}).join('\n');
fs.writeFile("./campList", names, function(err) {
  if (err) {
    return console.log(err);
  }
});

【讨论】:

  • 这似乎是一种比追加和迭代更好的方法,原因有很多。
【解决方案2】:

来自writeFile docs:

请注意,在同一个文件上多次使用 fs.writeFile 而不等待回调是不安全的。对于这种场景,强烈推荐使用 fs.createWriteStream

另外:

将数据异步写入文件,如果文件已存在则替换该文件。

【讨论】:

  • createWriteStream 出现错误,未知编码:a。 H。斯蒂芬斯州立历史公园
【解决方案3】:

根据您的评论,您需要将内容附加到文件中,因此以下代码将起作用

var data = require('./campSample.json');
var dataArray = data.resultset.result;
var fs = require('fs');

for(var i = 0; i < dataArray.length; i++){
    fs.appendFile("./campList", dataArray[i]["-facilityName"]+'\r\n', function (err) {
        if(err){
            return console.log(err);
        }
    });
}

【讨论】:

  • 啊哈!这对我有用。非常感谢您的帮助。 for 循环现在正在将 facilityNames 以列表格式写入一个新文件。谢谢!