Получение свойства объекта JSON по индексу?
Предполагая этот объект 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.
Ответы
Ответ 1
Объекты в JavaScript - это коллекции неупорядоченных свойств. Объекты - hashtables.
Если вы хотите, чтобы ваши свойства были в алфавитном порядке, одним из возможных решений могло бы стать создание индекса для ваших свойств в отдельном массиве. Всего несколько часов назад я ответил на вопрос о переполнении стека, который вы можете проверить:
Здесь быстрая адаптация для вашего объекта 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
.
Ответ 2
Нет, нет доступа к элементу по индексу в объектах 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...
}
Ответ 3
Я знаю, что это старый вопрос, но я нашел способ получить поля по индексу.
Вы можете сделать это, используя метод Object.keys
.
Когда вы вызываете метод Object.keys
, он возвращает ключи в том порядке, в котором они были назначены (см. пример ниже). Я протестировал метод ниже в следующих браузерах:
- Google Chrome версии 43.0
- Firefox версии 33.1
- Internet Explorer версии 11
Я также написал небольшое расширение класса объектов, чтобы вы могли вызвать n-й ключ объекта с помощью 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);
}
Ответ 4
Здесь вы можете получить доступ к свойству "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 возвращают все ключи предоставленного объекта в виде массива.
Ответ 5
Вы можете выполнить итерацию по объекту и присвоить свойства индексам, например:
var lookup = [];
var i = 0;
for (var name in obj) {
if (obj.hasOwnProperty(name)) {
lookup[i] = obj[name];
i++;
}
}
lookup[2] ...
Однако, как говорили другие, ключи в принципе неупорядочены. Если у вас есть код, который зависит от кодекса, считайте его взломанным. Убедитесь, что у вас есть модульные тесты, чтобы вы знали, когда они сломаются.
Ответ 6
Простое решение, только одна строка.
var obj = {
"set1": [1, 2, 3],
"set2": [4, 5, 6, 7, 8],
"set3": [9, 10, 11, 12]
};
obj = Object.values(obj);
obj[1]....
Ответ 7
"""
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
Jeroen Vervaeke ответ модульный и работает отлично, но может вызвать проблемы, если он использует с jQuery или другими библиотеками, которые учитывают функцию "объект-как-hashtables" Javascript.
Я немного изменил его, чтобы использовать эти библиотеки.
function getByIndex(obj, index) {
return obj[Object.keys(obj)[index]];
}
Ответ 9
Нет второго свойства. Когда вы говорите var obj = { ... }
, свойства внутри фигурных скобок неупорядочены. Даже цикл "for", проходящий через них, может возвращать их в разных порядках в разных реализациях JavaScript.
Ответ 10
Мое решение:
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));