通过索引检索 JSON 对象的属性?

IT技术 javascript json
2021-03-07 17:51:09

假设这个 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 文字/字符串定义的“原始”顺序。

6个回答

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]]);

之前引用答案提出了一个可重复使用的解决方案来迭代这样的对象。那是除非您可以将 JSON 更改为@Jacob Relkin 在另一个答案中建议的那样,这可能会更容易。


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

@Šime Vidas:是的,不想让这个例子复杂化太多......但好主意。我会更新那个答案和这个答案,并附上注释。
2021-04-22 17:51:09
那是您在那里得到的一个详尽的答案:) 但是,您不应该hasOwnPropertyfor in循环进行检查吗?(以防某些东西增强了Object.prototype对象。)
2021-04-23 17:51:09
obj[Object.keys(obj)[1]]有效...Object.keys(obj)[0]返回"set1"然后您只需像往常一样将其放入属性访问器中。
2021-05-12 17:51:09

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

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

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

我还为对象类编写了一个小扩展,以便您可以使用getByIndex.

// 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,那太圆滑了。这正是我今晚所需要的。感谢您抽出时间发布您对这个老问题的回答。
2021-05-05 17:51:09

不,无法通过 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...
}

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

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

obj = Object.values(obj);

obj[1]....

您可以在此处访问“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..