使用 fs.writeFile() 创建新对象并写入文件

Create new object and write to file with fs.writeFile()

我想做两件事:

我想从现有对象创建一个新的对象数组,

并递增对象,这样每个对象的计数 id 可以是 1、2、3 等

我的问题是,当我写入文件时,它只将 1 个随机对象写入文件,其余的不显示。有很多错误,所有对象都有相同的增量值。请解释我做错了什么。谢谢

代码:

data.json:

{  
   "users":[  
      {  
         "name":"mike",       
         "category":[  
            {  
               "title":"cook",
            }
         ],
         "store":{  
            "location":"uptown",
            "city":"ulis"
         },
         "account":{  
            "type":"regular", 
            "payment":[  
               "active":false
            ]
         }
      }
   ]
}

index.js:

const appData = ('./data.json')
const fs = require('fs');
let newObject = {}



appData.forEach(function(items){

        let x = items
        let  numincrement = 1++

        newObject.name = x.name
        newObject.count =  numincrement
        newObject.categories =  x.categories
        newObject.store =  x.store
        newObject.account = x.account 

        fs.writeFile('./temp.json', JSON.stringify(newObject, null, 2),'utf8' , function(err, data) {
            // console.log(data)
            if(err) { 

                console.log(err)
                return
            } else{
                console.log('created')
            }
          })
    })

这里有一大堆问题:

  1. 您只是将同一个对象一遍又一遍地重写到文件中。 fs.writeFile() 重写整个文件。它不会附加到文件。此外,您也不能附加到 JSON 格式。所以,这段代码只会每次将一个对象写入文件。
  2. 要将新的 JSON 数据附加到现有文件中的内容,您必须读入现有的 JSON,解析它以将其转换为 Javascript 数组,然后将新项目添加到数组中,然后转换回 JSON 并再次写出文件。为了更有效地附加,您需要不同的数据格式(可能是逗号分隔行)。
  3. 你的循环有各种各样的问题。您一遍又一遍地分配给同一个 newObject
  4. 您的 numincrement 在循环内,因此它在每次循环调用时都具有相同的值。您也可以只使用传递给 forEach() 回调的 index 参数,而不是使用您自己的变量。
  5. 如果您要迭代的是数据中的 users 数组,那么您可能需要迭代 appData.users,而不仅仅是 appData.

如果您真的只想将数据附加到文本文件,JSON 不是最容易使用的格式。只使用逗号分隔行可能更容易。然后,您可以将新行附加到文件中。 JSON.

真的做不到

如果您只想用当前数据覆盖文件,可以这样做:

const appData = ('./data.json').users;
const fs = require('fs');

// create an array of custom objects
let newData = appData.map((item, index) => {
    return {
        name: item.name,
        count: index + 1,
        categories: item.categoies,
        store: item.store,
        account: item.account
    };
});
// write out that data to a file as JSON (overwriting existing file)
fs.writeFile('./temp.json', JSON.stringify(newData, null, 2),'utf8' , function(err, data) {
    if (err) {
        console.log(err);
    } else {
        console.log("data written");
    }
});