使用NodeJ从复杂的Json结构中获取数据

时间:2018-03-12 09:34:22

标签: arrays json node.js mongodb

json结构:

    {
    "id" : "1",
    "Data" : [
    {
            "name" : "abc",

        },
        {
            "name" : "option1",
            "position" : [
                {
                    "name" : "option1",
                    "status" : [
                        {
                            "code" : "0",
                            "value" : "OFF"
                        },
                        {
                            "code" : "1",
                            "value" : "ON"
                        }
                    ]
                }]
        }   ]   
}

在这里,我想从上面复杂的Json结构中获取数据。如何做到这一点, 试过下面的代码,但是给出了错误; 错误:uncaughtException:无法读取未定义的属性“status”

function myfunc(req,res){
var collectionname  = db.collection("col1");
collectionname.find({}).each(function(err, doc) {
   if(doc != null)
    {
        var fdata = [];
        for(var i =0;i<doc.Data.length;i++){
            fdata.push(doc.Data[i].position.status);
            }
        console.log("fdata............",fdata);
    }
});
}

请帮助。

3 个答案:

答案 0 :(得分:1)

我是nodejs的新手,希望这是正确的

//I assume this is a object or you can convert from string to object
var data = {
    "id": "1",
    "Data": [
        {
            "name": "option1",
            "position": [
                {
                    "name": "option1",
                    "status": [
                        {
                            "code": "0",
                            "value": "OFF"
                        },
                        {
                            "code": "1",
                            "value": "ON"
                        }
                    ]
                }]
        }]
}

var statusArr = data.Data[0].position[0].status;
console.log(...statusArr);

结果:{ code: '0', value: 'OFF' } { code: '1', value: 'ON' }

答案 1 :(得分:1)

您可以使用foreach来防止未定义的长度。

function myfunc(req,res)
{
    let collectionname = db.collection("col1");
    collectionname.find({}).each(function(err, doc)
    {
        if(doc != null)
        {
            let fdata = [];

            for(let i in doc.Data)
            {
                for(let j in doc.Data[i].position)
                {
                    fdata.push(doc.Data[i].position[j].status);
                }
            }

            console.log("fdata............", fdata);
        }
    });
}

@MikaelLennholm有权,for(let i in doc.Data)有效但不推荐,小心不要在原型或对象构建的数组中使用它。

修改

function myfunc(req,res)
{
    db.collection('col1').find({}).each(function(err, doc)
    {
        if(err)
        {
            console.log('[INFOS] Request fail, more details:\n', err);
        }
        else if(doc)
        {
            let fdata = [];

            if(doc.Data && doc.Data.length)
            {
                for(let i = doc.Data.length-1; i >= 0; i--)
                {
                    if(doc.Data[i].position && doc.Data[i].position.length)
                    {
                        for(let j = doc.Data[i].position.length-1; j >= 0; j--)
                        {
                            if(doc.Data[i].position[j].status)
                            {
                                fdata = fdata.concat(doc.Data[i].position[j].status);
                            }
                        }
                    }
                }
            }

            console.log("[INFOS] Datas:\n", fdata);
        }
    });
}

答案 2 :(得分:0)

通过位置数组解析

function myfunc(req,res){
var collectionname  = db.collection("col1");
collectionname.find({}).each(function(err, doc) {
   if(doc != null)
    {
        var fdata = [];

        for(var i =0;i<doc.Data.length;i++){
        for(var j =0;j<doc.Data[i].position.length;j++){
            fdata.push(doc.Data[i].position[j].status);
            }
        }
        console.log("fdata............",fdata);
    }

}); }