【问题标题】:JS associative object with duplicate names具有重复名称的JS关联对象
【发布时间】:2011-04-29 02:38:16
【问题描述】:

好的,所以我有一个像这样的对象:

var myobject = {
   "field_1": "lorem ipsum",
   "field_2": 1,
   "field_2": 2,
   "field_2": 6
};

如您所见,对象中有重复的名称,但具有不同的值。如果我通过它(使用 jQuery):

$.each(myobject, function(key, value)
{
   console.log(key);
   console.log(myobject[key]);
   console.log(myobject[value]);
}

key - returns the correct key
myobject[key] - returns the name for that key
myobject[value] - returns the last elements', with that name, value

对于 field_2 的含义,它将返回 6,尽管它会打印 3 次,因为它在对象中重复了 3 次。

我的问题是如何为那个重复的命名字段获取正确的值,而不仅仅是最后一个的

谢谢

【问题讨论】:

  • 据我所知,这样的数组是行不通的。他们首先来自哪里?
  • 那是不可能的。检查您的代码。
  • 您的代码中有语法错误 - 您的 $.each() 函数未关闭..

标签: javascript object duplicates javascript-objects associative


【解决方案1】:

Javascript 中不存在关联数组 - 您创建的是使用 JSON 格式的对象。

我怀疑这样的事情会给你更多你正在寻找的东西,尽管我建议你确切地质疑你想要实现的目标..

以下代码将允许您访问重复“键”的多个实例,但

var myDataset = [
   { "field_1": "lorem ipsum" },
   { "field_2": 1 },
   { "field_2": 2 },
   { "field_2": 6 }
];


$.each(myDataset, function(valuePairIndex, value)
{
    $.each(myDataset[valuePairIndex], function(key, value1)
    {
       var valuePair = myDataset[valuePairIndex];
       console.log(valuePairIndex);
       console.log(key + ' = ' + valuePair[key]);

//       console.log('key = ' + key);
//       console.log('valuePair[key] = ' + valuePair[key]);
    });
});

【讨论】:

    【解决方案2】:

    这不是一个数组,它是一个对象。您最好创建一个数组对象的属性并将不同的值存储在其中。

    var myarray = {
       "field_1": "lorem ipsum",
       "field_array": []
    };
    
    myarray.field_array.push(value);
    

    然后循环遍历数组的那个属性。

    【讨论】:

      【解决方案3】:

      这是不可能的。

      生成的对象仅包含 2 个元素,第一个和第二个 field_2 元素在创建时丢失。

      【讨论】:

        【解决方案4】:

        你不能这样做。数组键必须是唯一的。

        如果您安装了 Firefox/Firebug(或在其他浏览器中安装了类似软件),您可以在 Firebug 控制台中输入以下内容进行尝试:

        var myarray = {
           "field_1": "lorem ipsum",
           "field_2": 1,
           "field_2": 2,
           "field_2": 6
        };
        console.dir(myarray);
        

        Firebug 将响应:

        field_1      "lorum ipsum"
        field_2      6
        

        换句话说,它可以工作,但是为 field_2 指定的每个后续值都会覆盖前一个值;一次只能有一个值。

        最接近你想要的方法是让 field_2 本身成为一个数组,如下所示:

        var myarray = {
           "field_1": "lorem ipsum",
           "field_2": [1,2,6]
        };
        

        如果你现在做console.log,你会得到这个:

        field_1      "lorum ipsum"
        field_2
            0        1
            1        2
            2        6
        

        希望对您有所帮助。

        【讨论】:

        • 那些不是数组,它们是对象。当然,如果你愿意,你可以称它们为“myarray”,但它们不是数组。
        • @Pointy - 你当然是对的。我使用了“数组”这个词,因为这就是问题中的提问方式。
        • 很抱歉措辞如此粗鲁;在点击这个问题之前,我刚刚在这个黑暗的房间里的椅子上伤了脚:-)
        【解决方案5】:
        1. 您的代码语法无效。
        2. Javascript 中没有关联数组
        3. 你定义的是一个对象
        4. 如果您为某个属性赋值 3 次,请确保它包含最后一个值

        测试

        var obj = {
           "field_1": "lorem ipsum",
           "field_2": 1,
           "field_2": 2,
           "field_2": 6
        };
        
        for ( var i in obj ) {
          console.log(i + " = " + obj[i]);
        }
        

        输出

        field_1 = lorem ipsum
        field_2 = 6
        

        【讨论】:

          【解决方案6】:

          您将多次覆盖相同的值。

          你想要的可能是这样的:

          var myarray = {
             "field_1": "lorem ipsum",
             "field_2": [1,2,6]
          };
          

          可以用类似于你目前所拥有的方式编写:

          var myarray = {};
          
          myarray.field_1 = [];
          myarray.field_1.push('lorem ipsum');
          myarray.field_2 = [];
          myarray.field_2.push(1);
          myarray.field_2.push(2);
          myarray.field_2.push(6);
          

          请注意,我也将 field_1 设为了一个数组,为了保持一致性,我认为您可能想要。

          【讨论】:

          • 上面myarray的定义和下面myarray的定义不一样。您应该将字符串 "lorem ipsum" 放在第一个定义的 field_1 的数组文字中,或者简单地将字符串 "lorem ipsum" 分配给第二个定义的 field_1
          【解决方案7】:

          解决此问题的唯一方法是将字段更改为唯一标识符,或类似:

          变量 myarray = { "field_1": "lorem ipsum", “field_2”:[ {"value_1": 1}, {"value_2": 2}, {“value_3”:6} ] };

          【讨论】:

            【解决方案8】:

            键必须是唯一的。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2021-06-10
              • 2012-06-20
              • 1970-01-01
              • 1970-01-01
              • 2013-07-23
              相关资源
              最近更新 更多