Получить свойство объекта JSON по индексу? - PullRequest
38 голосов
/ 28 октября 2010

Предполагая, что этот объект 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.

Ответы [ 11 ]

30 голосов
/ 28 октября 2010

Объекты в JavaScript являются коллекциями неупорядоченных свойств. Объекты являются хеш-таблицами.

Если вы хотите, чтобы ваши свойства были в алфавитном порядке, одним из возможных решений было бы создание индекса для ваших свойств в отдельном массиве. Всего несколько часов назад я ответил на вопрос о переполнении стека, который вы, возможно, захотите проверить:

Вот быстрая адаптация для вашего объекта 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 на то, что @ Джейкоб Релкин предложил в другом ответе , что может быть проще.


1 Вы можете использовать метод hasOwnProperty(), чтобы убедиться, что свойства принадлежат вашему объекту и не наследуются от Object.prototype.

18 голосов
/ 28 октября 2010

Нет, нет способа получить доступ к элементу по индексу в объектах 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 голосов
/ 28 июня 2015

Я знаю, что это старый вопрос, но я нашел способ получить поля по индексу. Вы можете сделать это, используя метод 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);
}
8 голосов
/ 24 октября 2015

Здесь вы можете получить доступ к свойству "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 возвращает все ключи предоставленного объекта в виде массива ..

3 голосов
/ 07 июля 2017

Jeroen Vervaeke ответ является модульным и работает нормально, но он может вызвать проблемы , если он используется с jQuery или другими библиотеками, которые рассчитывают на "object-as-hashtables"особенность Javascript.

Я немного изменил его, чтобы использовать с этими библиотеками.

function getByIndex(obj, index) {
  return obj[Object.keys(obj)[index]];
}
3 голосов
/ 28 октября 2010

Вы можете перебирать объект и назначать свойства индексам, например:

var lookup = [];
var i = 0;

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

lookup[2] ...

Однако, как уже говорили другие, ключи в принципе неупорядочены.Если у вас есть код, который зависит от кордера, считайте его взломанным.Убедитесь, что у вас есть модульные тесты, чтобы вы знали, когда он сломается.

2 голосов
/ 29 марта 2017

Простое решение, всего одна строка ..

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

obj = Object.values(obj);

obj[1]....
1 голос
/ 13 марта 2017
"""
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 голосов
/ 29 марта 2019

это довольно просто ...

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>
0 голосов
/ 30 декабря 2011

Мое решение:

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...