【问题标题】:Get data from complex Json structure using NodeJs使用 NodeJs 从复杂的 Json 结构中获取数据
【发布时间】:2018-03-16 01:04:30
【问题描述】:

json结构:

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

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

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

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);
    }
});
}

请帮忙。

【问题讨论】:

  • Position 是一个数组,因此无法使用 position.status 访问它。如果位置数组中只有一个对象,则可以使用 position[0].status
  • doc.Data[i].position 是一个数组
  • 更新了我的问题。
  • @TB.M doc.Data[i].position[0].status 但你需要考虑一下。它是一个数组这一事实意味着它可以包含任意数量(包括 0)的带有或不带有 status 属性的对象。你能确定总是至少有一个对象吗?如果有多个,你能确定第一个总是你想要的吗?
  • 是的,它不会总是 0 元素,我已经更新了有问题的数组,下面我也得到了答案。感谢理解。

标签: arrays json node.js mongodb


【解决方案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);
        }
    });
}

【讨论】:

  • 如果我们想在状态中包含名称,我们该怎么做?
  • 永远不要对数组使用in,这会导致奇怪的错误
  • 那么,我们如何归档结果?
  • 我正在使用 In 但它没有迭代,我想迭代数组??我们该怎么做?
  • 要添加名称,您可以通过fdata.push(doc.Data[i].position[j]);编辑fdata.push(doc.Data[i].position[j].status);
【解决方案2】:

我是 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' }

【讨论】:

  • 但是我这样做的方式没有发生......如果你检查我的代码。
【解决方案3】:

同样通过位置数组进行解析

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);
    }

}); }

【讨论】:

  • 错误:uncaughtException:无法读取未定义的属性“长度”。
  • 总是位置数组,
猜你喜欢
  • 2021-09-19
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
相关资源
最近更新 更多