Javascript nodejs:将函数生成的JSON数据与JSON文件进行比较

Javascript nodejs:将函数生成的JSON数据与JSON文件进行比较,javascript,json,node.js,readfile,writefile,Javascript,Json,Node.js,Readfile,Writefile,我有一个函数,可以扫描目录并创建一个包含音频文件元数据的JSON文件。我希望它检查文件是否已经存在,并且仅在上次运行脚本时创建的文件与第二次运行脚本时创建的数据之间存在差异时才覆盖 这是我的代码: var fs = require('fs'); var nodeID3 = require('node-id3'); var path = require('path'); var tracksPath = './public/tracks/'; var dataPath = './public/da

我有一个函数,可以扫描目录并创建一个包含音频文件元数据的JSON文件。我希望它检查文件是否已经存在,并且仅在上次运行脚本时创建的文件与第二次运行脚本时创建的数据之间存在差异时才覆盖

这是我的代码:

var fs = require('fs');
var nodeID3 = require('node-id3');
var path = require('path');
var tracksPath = './public/tracks/';
var dataPath = './public/data/';

fs.readdir(tracksPath,function(err,files){
    if(err) {
        throw err;
    }

    //Read the tracks metadata
    var tracksMetadata = [];
    files.forEach(function(trackName){
        var trackFile = nodeID3.read(tracksPath + trackName);


        //If the track returns metadata push it to the array
        if (trackFile.title && trackFile.artist){
            var metadata = {
                "filename" : trackName,
                "title" : trackFile.title,
                "artist" : trackFile.artist
            };
            tracksMetadata.push(metadata);
        }

        //If no metadata is found ignore and log it to the console
        else if (trackName.charAt(0) != "."){
            var filename = {
                  "filename" : trackName
            };

            tracksMetadata.push(filename);

            console.log(trackName + " doesn't have metadata. Ignoring.");
        }

        if(fs.existsSync(dataPath + "metadata.json")){
            fs.readFile(dataPath + "metadata.json",'utf8', function    (err, data){
                if (err) throw err;

                console.log(JSON.parse(JSON.stringify(data)));                  
               console.log(JSON.parse(JSON.stringify(tracksMetadata)));

                console.log(Boolean(JSON.parse(JSON.stringify(data)) == JSON.parse(JSON.stringify(tracksMetadata))));
        });
    }
    });


    fs.writeFile(path.join(dataPath, 'metadata.json'), 
JSON.stringify(tracksMetadata),'utf8', function(err){
        if(err){
            throw err;
        }
        console.log("Tracks Metadata JSON created succesfully");
    });
});
现在我只向控制台写入一个布尔值,用于检查文件中的数据和函数生成的数据是否相等,到目前为止,我得到的是false


我该怎么办?

这是因为您正在比较两个不同的对象引用。我不确定你从哪里得到了
JSON.parse(JSON.stringify(
code),但是试着只比较
data
JSON.stringify(tracksMetadata)
。我认为写会比读+比较+最终写更快。最终你可以检测到对文件夹的写操作,然后触发JSON更新?(这需要的不仅仅是nodejs.)@Jonasw原因是我正在尝试实现一项功能,在该功能中,我更改metadata.json中对象的顺序,并检查我是否有相同的文件和元数据。我不想在编写文件时覆盖顺序。@MikeMcCaughan谢谢!这是因为您正在比较两个不同的对象引用。我不是当然你从哪里得到了
JSON.parse(JSON.stringify(
code),但是试着只比较
data
JSON.stringify(tracksMetadata)
。我认为写会比读+比较+最终写更快。最终你可以检测到对文件夹的写操作,并在那之后触发JSON更新?(这需要更多的nodejs.。@Jonasw原因是我试图实现一项功能,在该功能中我更改metadata.json中对象的顺序,并检查我是否有相同的文件和元数据。我不想在编写文件时覆盖顺序。@Mikemcaughan谢谢!就是这样