在JSON数组集前添加新的JSON对象

时间:2017-02-28 05:47:34

标签: javascript arrays json node.js

当前正在使用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.

2 个答案:

答案 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字符串。