【问题标题】:Retrieving a property of a JSON object by index?按索引检索 JSON 对象的属性?
【发布时间】:2011-05-01 23:38:37
【问题描述】:

假设这个 JSON 对象:

var obj = {
    "set1": [1, 2, 3],
    "set2": [4, 5, 6, 7, 8],
    "set3": [9, 10, 11, 12]
};

“set2”属性可以这样检索:

obj["set2"]

有没有办法按索引检索“set2”属性?它是 JSON 对象的第二个属性。这不起作用(当然):

obj[1]  

所以,假设我想检索 JSON 对象的第二个属性,但我不知道它的名称 - 那我该怎么做呢?

更新: 是的,我知道对象是无序属性的集合。但我不认为浏览器会混淆 JSON 文字/字符串定义的“原始”顺序。

【问题讨论】:

  • 您需要通过遍历整个结构找出包含元素。我认为没有其他方法
  • 如果我理解正确,那么这里的每个答案都是错误的。 obj[Object.keys(obj)[1]] 返回索引 1 处的属性值:[4, 5, 6, 7, 8]
  • 相关帖子here.

标签: javascript json


【解决方案1】:

JavaScript 中的对象是 无序 属性的集合。对象是哈希表。

如果您希望属性按字母顺序排列,一种可能的解决方案是在单独的数组中为您的属性创建索引。就在几个小时前,我在 Stack Overflow 上回答了一个您可能想查看的问题:

以下是您的对象的快速调整1

var obj = {
    "set1": [1, 2, 3],
    "set2": [4, 5, 6, 7, 8],
    "set3": [9, 10, 11, 12]
};

var index = [];

// build the index
for (var x in obj) {
   index.push(x);
}

// sort the index
index.sort(function (a, b) {    
   return a == b ? 0 : (a > b ? 1 : -1); 
}); 

那么你就可以做到以下几点:

console.log(obj[index[1]]);

前面的answer I cited 提出了一种可重用的解决方案来迭代这样的对象。除非您可以将 JSON 更改为 @Jacob Relkin suggested in the other answer,否则会更容易。


1您可能希望使用hasOwnProperty() 方法来确保属性属于您的对象,而不是从Object.prototype 继承。

【讨论】:

  • 这是您从那里得到的一个详尽的答案:) 但是,您不应该在for in 循环内进行hasOwnProperty 检查吗? (以防某些东西增强了 Object.prototype 对象。)
  • @Šime Vidas:是的,我不想让这个例子过于复杂……但这是个好主意。我会更新那个答案和这个答案,并附上一个注释。
  • obj[Object.keys(obj)[1]] 有效...Object.keys(obj)[0] 返回"set1" 然后您只需像往常一样将其放入属性访问器中。
【解决方案2】:

我知道这是一个老问题,但我找到了一种按索引获取字段的方法。 您可以使用Object.keys 方法来做到这一点。

当您调用Object.keys 方法时,它会按照分配的顺序返回键(参见下面的示例)。我在以下浏览器中测试了以下方法:

  • 谷歌浏览器版本 43.0
  • Firefox 版本 33.1
  • Internet Explorer 版本 11

我还为对象类编写了一个小扩展,因此您可以使用 getByIndex 调用对象的第 n 个键。

// Function to get the nth key from the object
Object.prototype.getByIndex = function(index) {
  return this[Object.keys(this)[index]];
};

var obj1 = {
  "set1": [1, 2, 3],
  "set2": [4, 5, 6, 7, 8],
  "set3": [9, 10, 11, 12]
};

var obj2 = {
  "set2": [4, 5, 6, 7, 8],
  "set1": [1, 2, 3],
  "set3": [9, 10, 11, 12]
};

log('-- Obj1 --');
log(obj1);
log(Object.keys(obj1));
log(obj1.getByIndex(0));


log('-- Obj2 --');
log(obj2);
log(Object.keys(obj2));
log(obj2.getByIndex(0));


// Log function to make the snippet possible
function log(x) {
  var d = document.createElement("div");
  if (typeof x === "object") {
    x = JSON.stringify(x, null, 4);
  }
  d.textContent= x;
  document.body.appendChild(d);
}

【讨论】:

  • Jeroen,这太漂亮了。这正是我今晚所需要的。感谢您花时间发布您对这个老问题的回答。
【解决方案3】:

不,无法通过 JavaScript 对象中的索引访问元素。

如果您可以访问此 JSON 的源,一个解决方案是将每个元素更改为 JSON 对象并将密钥粘贴在该对象中,如下所示:

var obj = [
    {"key":"set1", "data":[1, 2, 3]},
    {"key":"set2", "data":[4, 5, 6, 7, 8]},
    {"key":"set3", "data":[9, 10, 11, 12]}
];

然后您将能够以数字方式访问元素:

for(var i = 0; i < obj.length; i++) {
    var k = obj[i]['key'];
    var data = obj[i]['data'];
    //do something with k or data...
}

【讨论】:

    【解决方案4】:

    简单的解决方案,只需一行..

    var obj = {
        "set1": [1, 2, 3],
        "set2": [4, 5, 6, 7, 8],
        "set3": [9, 10, 11, 12]
    };
    
    obj = Object.values(obj);
    
    obj[1]....
    

    【讨论】:

      【解决方案5】:

      在这里您可以访问以下“set2”属性:

          var obj = {
              "set1": [1, 2, 3],
              "set2": [4, 5, 6, 7, 8],
              "set3": [9, 10, 11, 12]
          };
      
          var output = Object.keys(obj)[1];
      

      Object.keys 将提供的对象的所有键返回为 Array..

      【讨论】:

        【解决方案6】:

        Jeroen Vervaeke 的答案是模块化的,并且工作正常,但如果它与 jQuery 或其他依赖 Javascript 的“object-as-hashtables”功能的库一起使用,则它是 can cause problems

        我对它进行了一些修改,使其可以与这些库一起使用。

        function getByIndex(obj, index) {
          return obj[Object.keys(obj)[index]];
        }
        

        【讨论】:

          【解决方案7】:

          您可以遍历对象并将属性分配给索引,如下所示:

          var lookup = [];
          var i = 0;
          
          for (var name in obj) {
              if (obj.hasOwnProperty(name)) {
                  lookup[i] = obj[name];
                  i++;
              }
          }
          
          lookup[2] ...
          

          但是,正如其他人所说,键原则上是无序的。如果您有依赖于绳索的代码,请将其视为 hack。确保你有单元测试,这样你就会知道它什么时候坏了。

          【讨论】:

            【解决方案8】:
            """
            This could be done in python as follows.
            Form the command as a string and then execute
            """
            context = {
                "whoami": "abc",
                "status": "0",
                "curStep": 2,
                "parentStepStatus": {
                    "step1":[{"stepStatus": 0, "stepLog": "f1.log"}],
                    "step2":[{"stepStatus": 0, "stepLog": "f2.log"}]
                }
            }
            def punc():
                      i = 1
                      while (i < 10):
                          x = "print(" + "context" + "['parentStepStatus']" + "['%s']"%("step%s")%(i) + ")"
                          exec(x)
                          i+=1
            punc()
            

            【讨论】:

              【解决方案9】:

              没有“第二个属性”——当您说var obj = { ... } 时,大括号内的属性是无序的。即使是遍历它们的“for”循环也可能在不同的 JavaScript 实现中以不同的顺序返回它们。

              【讨论】:

                【解决方案10】:

                其实很简单……

                var obj = {
                    "set1": [1, 2, 3],
                    "set2": [4, 5, 6, 7, 8],
                    "set3": [9, 10, 11, 12]
                };
                
                jQuery.each(obj, function(i, val) {
                	console.log(i); // "set1"
                	console.log(val); // [1, 2, 3]
                });
                &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"&gt;&lt;/script&gt;

                【讨论】:

                  【解决方案11】:

                  我的解决方案:

                  Object.prototype.__index=function(index)
                                           {var i=-1;
                                            for (var key in this)
                                                {if (this.hasOwnProperty(key) && typeof(this[key])!=='function')
                                                    {++i;
                                                    }
                                                 if (i>=index)
                                                    {return this[key];
                                                    }
                                                }
                                            return null;
                                           }
                  aObj={'jack':3, 'peter':4, '5':'col', 'kk':function(){alert('hell');}, 'till':'ding'};
                  alert(aObj.__index(4));
                  

                  【讨论】:

                    猜你喜欢
                    • 2015-07-04
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-12-13
                    • 1970-01-01
                    • 2013-06-16
                    • 2013-03-09
                    相关资源
                    最近更新 更多