假设这个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文字/字符串定义的“原始”顺序。
答案 0 :(得分:30)
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
继承。
答案 1 :(得分: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...
}
答案 2 :(得分:17)
我知道这是一个老问题,但我找到了一种通过索引获取字段的方法。
您可以使用Object.keys
方法执行此操作。
当您调用Object.keys
方法时,它会按照分配的顺序返回键(请参阅下面的示例)。我在以下浏览器中测试了以下方法:
我还为对象类编写了一个小扩展,以便您可以使用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);
}
答案 3 :(得分:7)
您可以在此处访问“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 ..
答案 4 :(得分:3)
您可以迭代对象并为索引分配属性,如下所示:
var lookup = [];
var i = 0;
for (var name in obj) {
if (obj.hasOwnProperty(name)) {
lookup[i] = obj[name];
i++;
}
}
lookup[2] ...
然而,正如其他人所说,钥匙原则上是无序的。如果您的代码依赖于corder,请将其视为黑客。确保你有单元测试,以便你知道它何时中断。
答案 5 :(得分:3)
Jeroen Vervaeke的答案是模块化的,工作正常,但如果它与jQuery或其他依赖于Javascript的“object-as-hashtables”功能的库一起使用,则can cause problems。
我对它进行了一些修改以使这些库可用。
function getByIndex(obj, index) {
return obj[Object.keys(obj)[index]];
}
答案 6 :(得分:2)
简单的解决方案,只需一行..
var obj = {
"set1": [1, 2, 3],
"set2": [4, 5, 6, 7, 8],
"set3": [9, 10, 11, 12]
};
obj = Object.values(obj);
obj[1]....
答案 7 :(得分: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()
答案 8 :(得分:0)
没有“第二个属性” - 当你说var obj = { ... }
时,大括号内的属性是无序的。即使是“for”循环遍历它们也可能在不同的JavaScript实现上以不同的顺序返回它们。
答案 9 :(得分:0)
这很简单...
xcdatamodeld
"momd"
答案 10 :(得分:-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));