当前正在使用nodeJs并且一直在尝试将新数据写入现有的JSON文件,只是遇到格式问题以及获取正确的数据。我想将这个新的JSON obj转换为第一个数组列表。我通过抓取第一个索引ID,增加它并尝试使用unshift()
来做到这一点,但它没有按照我的预期添加。
JSON文件内容data.json
:
[
{
"id": 3,
"content": "three"
},
{
"id": 2,
"content": "two"
},
{
"id": 1,
"content": "one"
}
]
我为新JSON obj编写的代码我要添加:
var allJSON = fs.readFileSync('data.json');
var allj = JSON.parse(allJSON);
var lastId = parseInt(allj[0].id);
var newData = {
id: ++lastId,
content: "test"
};
var allNewJSON = allj.unshift(JSON.stringify(newData));
// this yields a result of just the number "4" and erased everything else.
答案 0 :(得分:1)
您的结果归因于unshift
的工作方式。
unshift
是一个返回更新数组长度的函数。
例如
> const a = [10, 20, 30];
> a.unshift(5);
4
没错,对unshift
的调用会返回4 ,因为更新的数组有4个元素。
让我们看看a
的更新值:
> a
[5, 10, 20, 30]
答案 1 :(得分:1)
Array#unshift
不会创建并返回新数组;相反,它修改原始数组并返回其新的长度。在您的情况下,此值为4
。我建议忽略unshift
的返回值,只需使用allj
变量继续执行代码,如下所示:
var allJSON = fs.readFileSync('data.json');
var allj = JSON.parse(allJSON);
var lastId = parseInt(allj[0].id);
var newData = {
id: ++lastId,
content: "test"
};
allj.unshift(newData);
console.log(allj) // modified as desired!
编辑:正如上面的评论中所提到的,在将对象插入数组之前,您可能不希望在对象JSON.stringify
上调用newData
。此时,您希望使用JS对象而不是JSON字符串。