Подтвердить что ты не робот

Получение свойства объекта 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.

4b9b3361

Ответ 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));