Javascript 我的代码可以工作,但不知道为什么(使用对象)
我有以下目标:Javascript 我的代码可以工作,但不知道为什么(使用对象),javascript,object,javascript-objects,Javascript,Object,Javascript Objects,我有以下目标: 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","form
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"];
}
}
如果您注意的话,您会看到我添加到新对象的第一个值使用的格式与其他值不同
我发现,如果我用第二种格式添加每个值,它就不会添加任何内容。
但如果我以第一种格式添加所有内容,它只会添加最后一个值
所以,我用第一种格式制作了淡水河谷,其余的用第二种格式,效果很好
…为什么,有人能向我解释为什么会发生这种情况吗?在当前形式中,您正在初始化它,告诉它在该位置创建一个对象,并使用值
{“estado”:dataobj[x][0][“value”]}对其进行“初始化”代码>。
随后尝试访问对象datafinal[x]
,然后访问该对象的属性,由于该属性尚不存在,因此使用给定值创建该属性。
通过简单地重复行datafinal[x]={“estado”:dataobj[x][0][“value”}代码>正如您使用不同的键和值所建议的,您只是在覆盖
每次使用新对象时,datafinal[x]
的值
编辑:
至于为什么只在第二种格式中添加值不起作用,这取决于这样做是为了访问一个尚不存在的对象datafinal[x]
的属性。然而,以第一种格式调用一次会创建该对象。如果使用第一种格式,则每次调用时都会重写所有对象
datafinal[x] = { "estado": dataobj[x][0]["value"] };
这意味着datafinal[x]
等于这个值,如果您这样做的话
datafinal[x] = { "fecha" = dataobj[x][1]["value"] };
它将擦除datafinal[x]
这就是为什么您的第一种格式不起作用的原因,这是因为最初的datafinal[x]
还不存在,所以您需要给它一个值,即给它分配一个对象。这就是第一个作业所做的。其他指定正在改变现有值,因为您不希望它们替换您在第一行中指定的值
请注意,其他指定不会指定给datafinal[x]
本身,而是写入它的一个属性:因此您扩展了在第一个指定中指定的对象
事实上,第一项任务可以分为两部分:
datafinal[x] = {};
datafinal[x].estado = dataobj[x][0].value;
。。。所以现在所有的属性赋值看起来都一样(注意:这些文字属性名不需要方括号表示法)。第一个赋值现在只是将值初始化为对象(与数字、字符串、布尔值等相对)。如果没有这样的指定,您就没有对象,也无法为其指定属性
如果将其写入一个对象文字赋值,可能会更容易理解:
datafinal[x] = {
estado: dataobj[x][0].value,
fecha: dataobj[x][1].value,
pais: dataobj[x][2].value,
precio: dataobj[x][3].value
};
如果只显示dataobj,您会得到什么?您已经显示了dataset
,但没有显示dataset.getData()返回的内容。dataobj显示的信息与第一个dataset对象相同。为什么我们都会被无意识地否决?我们所有的答案都暗示了回答问题的相同点,但都被否决了。我不知道可能是个恶棍,我不能投票,但我没有足够的声誉,但我读的每个答案对我来说都是一样的。这家伙到底在干什么?