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

问题描述 投票:36回答:11

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

javascript json
11个回答
30
投票

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

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

这是对你的object1的快速改编:

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继承。


0
投票

这很简单......

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]
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

-1
投票

我的解决方案

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

18
投票

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

17
投票

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

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

  • 谷歌Chrome版本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);
}

8
投票

在这里,您可以访问“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返回..


3
投票

您可以迭代对象并为索引分配属性,如下所示:

var lookup = [];
var i = 0;

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

lookup[2] ...

然而,正如其他人所说,钥匙原则上是无序的。如果您的代码依赖于corder,请将其视为黑客。确保你有单元测试,以便你知道它何时中断。


3
投票

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

我修改了一下以使这些库可用。

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

2
投票

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

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

obj = Object.values(obj);

obj[1]....

1
投票
"""
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()

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.