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

时间:2019-06-21 23:00:42

标签: javascript arrays node.js object fs

我想做两件事:

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

并增加对象,以便每个对象可以具有1,2,3等的计数ID

我的问题是,当我写入文件时,它仅向文件写入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 个答案:

答案 0 :(得分:1)

这里有很多问题:

  1. 您只是一次又一次地将同一对象重写到文件中。 fs.writeFile()重写了整个文件。它不会追加到文件中。此外,您也不能附加到JSON格式。因此,此代码仅会将每个对象写入一个文件。
  2. 要将新的JSON数据附加到现有文件中,您必须读取现有的JSON,对其进行解析以将其转换为Javascript数组,然后将新项目添加到该数组中,然后再转换回JSON并编写再次取出文件。为了更有效地附加,您需要使用其他数据格式(也许用逗号分隔的行)。
  3. 您的循环有各种各样的问题。您要一遍又一遍地分配给同一newObject
  4. 您的numincrement在循环内,因此在每次循环调用时它将具有相同的值。您也可以只使用传递给index回调的forEach()参数,而不使用您自己的变量。
  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");
    }
});