使用 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')
}
})
})
这里有一大堆问题:
- 您只是将同一个对象一遍又一遍地重写到文件中。
fs.writeFile()
重写整个文件。它不会附加到文件。此外,您也不能附加到 JSON 格式。所以,这段代码只会每次将一个对象写入文件。
- 要将新的 JSON 数据附加到现有文件中的内容,您必须读入现有的 JSON,解析它以将其转换为 Javascript 数组,然后将新项目添加到数组中,然后转换回 JSON 并再次写出文件。为了更有效地附加,您需要不同的数据格式(可能是逗号分隔行)。
- 你的循环有各种各样的问题。您一遍又一遍地分配给同一个
newObject
。
- 您的
numincrement
在循环内,因此它在每次循环调用时都具有相同的值。您也可以只使用传递给 forEach()
回调的 index
参数,而不是使用您自己的变量。
- 如果您要迭代的是数据中的
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");
}
});
我想做两件事:
我想从现有对象创建一个新的对象数组,
并递增对象,这样每个对象的计数 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')
}
})
})
这里有一大堆问题:
- 您只是将同一个对象一遍又一遍地重写到文件中。
fs.writeFile()
重写整个文件。它不会附加到文件。此外,您也不能附加到 JSON 格式。所以,这段代码只会每次将一个对象写入文件。 - 要将新的 JSON 数据附加到现有文件中的内容,您必须读入现有的 JSON,解析它以将其转换为 Javascript 数组,然后将新项目添加到数组中,然后转换回 JSON 并再次写出文件。为了更有效地附加,您需要不同的数据格式(可能是逗号分隔行)。
- 你的循环有各种各样的问题。您一遍又一遍地分配给同一个
newObject
。 - 您的
numincrement
在循环内,因此它在每次循环调用时都具有相同的值。您也可以只使用传递给forEach()
回调的index
参数,而不是使用您自己的变量。 - 如果您要迭代的是数据中的
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");
}
});