嵌套在回调内的JSONParse数组丢失了上下文

时间:2014-07-28 02:08:47

标签: javascript json

我尝试从响应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"}
           }
}

所以,我尝试迭代“数组”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)
                {
                   ...
                }   
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

使用像这样的for循环

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