【问题标题】:my code works and no idea why (working with objects)我的代码有效,但不知道为什么(使用对象)
【发布时间】:2017-06-16 21:49:13
【问题描述】:

我有以下对象:

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"];
    }               
}

如果你注意的话,你会看到我添加到新对象的第一个值是使用不同的格式来添加的。

我发现,如果我使用第二种格式添加每个值,它不会添加任何内容。 但是如果我以第一种格式添加所有内容,它只会添加最后一个值;

所以,我用第一种格式制作了 vale,其余的用第二种格式制作,效果很好。

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

【问题讨论】:

  • 只显示dataobj有什么用?
  • 你显示了dataset,但没有显示dataset.getData() 返回的内容。
  • dataobj 显示与第一个数据集对象相同的信息。

标签: javascript object javascript-objects


【解决方案1】:

这是因为一开始datafinal[x]还不存在,所以你需要给它一个值,即给它一个对象。这就是第一个任务所做的。其他分配是 mutating existing 值,因为您不希望它们替换您在第一行中分配的值。

请注意,其他分配不分配给 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
};

【讨论】:

    【解决方案2】:

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

    编辑:

    至于为什么只添加第二种格式的值不起作用,这是因为这样做时您试图访问尚不存在的对象datafinal[x] 的属性。然而,通过以您的第一种格式进行一次调用会创建该对象。

    【讨论】:

    • 为什么我们都被盲目地投反对票?我们所有的答案都暗示了回答问题但被否决的相同点。
    • 不知道可能是巨魔,我不能投票但没有足够的声誉,但我阅读了每个答案
    • 对我来说也一样。这家伙到底在干什么?
    【解决方案3】:

    如果你使用你的第一种格式,它会在你每次调用它时重写你的所有对象

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

    表示datafinal[x] 等于,所以如果你这样做

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

    它将删除datafinal[x]中的内容

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

    【讨论】:

      猜你喜欢
      • 2015-05-05
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 2014-01-17
      • 2013-09-13
      • 2022-01-08
      • 2017-04-01
      • 2022-01-22
      相关资源
      最近更新 更多