迭代节点中的很多JSON文件?

时间:2015-11-19 07:45:02

标签: javascript json node.js

我有以下代码,我想做的就是迭代一堆JSON文件 - 一个接一个 - 直到我到达最后,输出每个文件中每个对象的时间戳。

var fs = require('fs');

// Get the contents of the directory and loop over it.
fs.readdir('./historical', function(err, list)
{
    for (var i = 0; i < list.length; i++)
    {
        // Get the contents of each file on iteration.
        var filename = list[i];

        fs.readFile("./historical/" + filename, function(err, data){

        for (var index in data)
        {
                index = JSON.parse(index);
                console.log(index.timestamp);
            }
        });
    }
});

这似乎很难做任何事情......我无法让它真正发挥作用。

另外 - 我知道文件中的每个项目实际上都有一个时间戳值。

所有帮助表示赞赏,我已经在这方面工作了好几个小时!

2 个答案:

答案 0 :(得分:2)

使用for (var index in data)循环是错误的。您需要先解析json文件以获取json对象

var parsedData = JSON.parse(data);

然后你可以按照自己的意愿操纵你的json对象。如果你提供json文件示例会更好。但为了以防万一,我描述了两个例子。

示例1:
如果json文件表示对象,则使用以下代码

console.log(parsedData.timestamp);

示例2:
如果json文件表示对象数组,则使用以下代码

for (var index in parsedData) {
    console.log(index.timestamp);
}

答案 1 :(得分:0)

在您的情况下,数据是包含二进制数据的 buffer。 实际上,如果您指定编码,数据只是一个 string

我冒昧地将您的整个脚本更新为更新的 javascript 版本。 并添加文件扩展名过滤器。

import { readdir, readFile } from "fs";
import * as path from "path";

const dirName = path.join(__dirname, "historical");
readdir(dirName, (err, fileList) => {
  if (err) {
    console.error(err);
    return;
  }

  for (let i = 0; i < fileList.length; i++) {
    const filename = fileList[i];
    if (!filename.toLowerCase().endsWith(".json")) continue;

    const fullFilename = path.join(dirName, filename);
    readFile(fullFilename, { encoding: "utf-8" },
      (err, data) => {
        try {
          const fileContent = JSON.parse(data);
          // todo print whatever you like to print, e.g. console.log(fileContent);
        } catch (err) {
          console.error(`error while parsing file: ${fullFilename}`);
        }
      });
  }
});