我正在尝试使用fs在另一个文件中重写一个变量,而不更改/删除其他变量,但是我不知道该怎么做。
我想编辑一个名为data.json的文件,其中有很多变量。像这样:
"b": {
"ra": 100,
"error": 0
}
"a": {
"ra": 100,
"error": 0
}
如何在不删除A的情况下编辑B?
现在我有以下代码:
var datajson = fs.readFileSync(`data.json`);
var data = JSON.parse(datajson);
startdata = {
b: {
ra: 0,
error: 1
}
}
fs.writeFile("./data.json", JSON.stringify (startdata, null, 4), err => {
if (err) throw err;
})
此代码的问题是它从data.json中删除了每隔一行代码,而我最终得到了这一点:
"b": {
"ra": 0,
"error": 1
}
答案 0 :(得分:0)
fs.writeFile
将重写整个文件。
对此我们可以做些什么,我们还必须编写现有内容。您可以使用Object.assign
(或对象传播)来合并对象:
var newdata = Object.assign({},data,startdata)
上面的代码行将...
data
和startdata
的属性分配给该对象(startdata
的属性将覆盖data
的属性)newdata
因此,您的代码应如下所示:
var datajson = fs.readFileSync(`data.json`);
var data = JSON.parse(datajson);
startdata = {
b: {
ra: 0,
error: 1
}
}
var newdata = Object.assign({},data,startdata)
fs.writeFile("./data.json", JSON.stringify (newdata, null, 4), err => {
if (err) throw err;
})
答案 1 :(得分:0)
您可以尝试使用spread
运算符
startdata = {
...data,
b: {
ra: 0,
error: 1
}
}
在MDN上扩展运算符语法。
请确保还验证您的JSON:
https://jsonformatter.curiousconcept.com/
答案 2 :(得分:0)
其选项,可用于设置文件的开始指针/偏移量。 编写新的缓冲区,然后关闭流,就可以了。
数学只是为了估计开始位置-这是读者的练习;)
在您的示例中,它应该只是
// untested!
let index = fs.readFileSync('data.json') // "b" ...
.indexOf("b") // 2
if(index == -1) throw;
const ws = fs.createWriteStream(`data.json`, {start: index, flags: "rs+"});
ws.on('error', errHandler(err));
ws.on('close', function continueFromHere(){})
ws./*write*/end(JSON.stringify (startdata, null, 4), (err)=>notGuaranteedErrHandler(err));