This question already has answers here:
How can I access and process nested objects, arrays or JSON?
                                
                                    (25个答案)
                                
                        
                                5年前关闭。
            
                    
我尝试从响应解析Web服务的对象,其结构如下:

{ "idRonda":"1",
  "puntos":{
             "p1":{"id":1,"descripcion":"punto uno","tag":"0497e1b13e0280"},
             "p2":{"id":2,"descripcion":"punto dos","tag":"0498e9b13e0280"},
             "p4":{"id":4,"descripcion":"punto cuatro","tag":"04419092432f80"},
             "p5":{"id":5,"descripcion":"punto cinco","tag":"0462f812b82a80"},
             "p3":{"id":3,"descripcion":"punto tres","tag":"046cfd92432f80"}
           }
}


因此,我尝试遍历“ array” puntos,然后执行以下操作:

//data has the response from web service
var json = JSON.parse(data);
var puntos = json.puntos; //until here it's ok


当我打印puntos的值和类型时:

console.log( " Puntos Object : "+ puntos );
console.log( " TypeOf : "+ Ember.typeOf(puntos) );


输出:

Puntos Object : [object Object]
TypeOf : string


我的尝试:

for (var k in puntos)
{
    // I thought that k must be "p1", "p2"..., but I'm wrong
    if (puntos.hasOwnProperty(k))
    {
        var values = puntos[k];
        var id = values['id'];
    }
}


如果我打印k值,我会得到(我不知道这是什么意思):

key: 0
key: 1
.
.
.
key: 13
key: 14
key: fmt
key: w
key: loc
key: camelize
key: decamelize
key: dasherize
key: underscore
key: classify
key: capitalize
key: htmlSafe


现在如何遍历puntos对象以获取iddescripciontag值?

更新:

 var puntos = json.puntos;
 var db = window.sqlitePlugin.openDatabase("Rondas", "1.0", "Dev", -1);
 db.transaction(function(tx)
 {

        tx.executeSql("SELECT * from Punto;", [], function(tx, res)
        {
            if( res.rows.length === 0)
            {
                for (var k in puntos)
                {

                    if (puntos.hasOwnProperty(k))
                    {
                        var id = puntos[k].id;
                        var descripcion = puntos[k].descripcion;
                        var tag = puntos[k].tag;
                        console.log( "KEY: "+k+" ,ID: "+id + " ,DESCRIPCIÓN: "+descripcion+" ,TAG: "+tag );
                    }

                }
            }
        }
 }


上面的代码失败,因为对象puntos失去了作用域,因为它在回调内部,然后只有解决方案才能确保对象上下文。



    db.transaction(function(tx)
    {
        //ensure the object context.
        var points = puntos;
        tx.executeSql("SELECT * from Punto;", [], function(tx, res)
        {
            if( res.rows.length === 0)
            {
                for (var k in points)
                {
                   ...
                }
            }
        }
    }

最佳答案

使用这样的for循环

for(key in puntos)
{
   var id = puntos[key].id;
   var descripcion= puntos[key].descripcion;
   var tag = puntos[key].tag;
}

10-08 08:37