2017-06-16 60 views
1

我有以下对象:我的代码工作,也不知道为什么(使用对象)

var dataset = [ 
     [ 
     {"value":"PRE","formattedValue":"PRE"}, 
     {"value":"2017-06-15 00:00:00","formattedValue":"15/06/2017 0:00:00"}, 
     {"value":"COSTA RICA","formattedValue":"COSTA RICA"}, 
     {"value":"6.15","formattedValue":"6,150"} 
     ], 
     [ 
     {"value":"PRE","formattedValue":"PRE"}, 
     {"value":"2017-06-15 00:00:00","formattedValue":"15/06/2017 0:00:00"}, 
     {"value":"EL SALVADOR","formattedValue":"EL SALVADOR"} 
     ] 
] 

它太复杂,有数据其实我并不需要,所以我试图把它变成这样:

[ 
    { 
     "estado":  "PRE", 
     "fecha": "2017-06-15 00:00:00", 
     "pais":  "COSTA RICA", 
     "precio": "6.15",  
    } 
] 

我终于做到了,但我不确定为什么我的代码有效。 我这个代码做了它:

var datafinal = []; 
function convertion(){ 
    var dataobj = dataset.getData();    
    for(var x in dataobj){ 
     datafinal[x] = { "estado": dataobj[x][0]["value"] }; 
     datafinal[x]["fecha"] = dataobj[x][1]["value"]; 
     datafinal[x]["pais"] = dataobj[x][2]["value"]; 
     datafinal[x]["precio"] = dataobj[x][3]["value"]; 
    }    
} 

如果你留意,你会看到的第一个值我添加到新的对象是使用得到比其他人加入不同的格式。

我发现如果我用第二种格式添加每个值,它什么也不加。 但是,如果我在第一种格式中添加所有内容,它只会添加最后一个值;

因此,我在第一个格式中创建了val,其余的在第二个格式中,它工作得很好。

......为什么有人可以向我解释为什么会发生这种情况?

+0

? –

+0

您已经显示了'dataset',但没有显示'dataset.getData()'返回的内容。 –

+0

dataobj显示第一个数据集对象所具有的相同信息。 – proXima

回答

1

这是因为起初datafinal[x]还不存在,所以你需要给它一个值,即分配一个对象。这是第一项任务所做的。其他作业是变异现有值,因为您不希望它们以替换您在第一行中指定的值。

请注意,其他分配本身并不分配给datafinal[x],而是写入其属性:所以扩展了您在第一个分配中分配的对象。

事实上,第一个任务可以分为两个部分:

datafinal[x] = {}; 
datafinal[x].estado = dataobj[x][0].value; 

...所以现在所有的财产分配可能看起来是一样的(注:你不需要的方括号这些文字属性名称)。第一个赋值现在只是将该值初始化为一个对象(与数字,字符串,布尔值相反)。没有这样的赋值,你没有一个对象,也不能给它分配属性。

也许你可以更容易地理解,如果你将它在一个对象文本分配写:你有什么,如果你只是显示dataobj

datafinal[x] = { 
    estado: dataobj[x][0].value, 
    fecha: dataobj[x][1].value, 
    pais: dataobj[x][2].value, 
    precio: dataobj[x][3].value 
}; 
1

在当前表单中,您正在初始化告诉它在该位置创建一个对象,并使用值{ "estado": dataobj[x][0]["value"] };“初始化”该对象。 随后尝试访问对象datafinal[x],然后访问该对象的属性,并且由于该属性尚不存在,请使用您的给定值创建它。 通过简单重复datafinal[x] = { "estado": dataobj[x][0]["value"] };这一行,您可以使用不同的键和值进行建议,您只需每次使用新对象覆盖 的值datafinal[x]

编辑:

至于为什么只在你的第二个格式不起作用增加值,这是下跌的事实,这样做你正在试图访问对象datafinal[x]是没有的特性还存在。而通过以您的第一种格式进行一次调用将创建该对象。

+0

为什么我们都会盲目低估?我们所有的答案都暗示回答这个问题的相同点,但是已经被低估了。 – dbr

+0

不知道可能是一个巨魔,我不能投票,但没有足够的声誉,但即时阅读每个答案 – proXima

+0

相同的我。这家伙到底在做什么? –

1

如果您使用第一种格式,将改写所有对象每次你怎么称呼它

datafinal[x] = { "estado": dataobj[x][0]["value"] }; 

意味着datafinal[x]等于所以如果你做

datafinal[x] = { "fecha" = dataobj[x][1]["value"] }; 

它会删除什么的datafinal[x]

这就是为什么你的第一种格式不起作用

相关问题