2010-10-28 3 views
33

Предполагая это 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, но я не знаю его имя - как бы мне это делать?

Update: Да, я понимаю, что объекты являются коллекцией неупорядоченных свойств. Но я не думаю, что браузеры беспорядочны с «оригинальным» порядком, определенным литералом JSON/строкой.

+0

Вам нужно будет найти содержащийся элемент, пройдя всю структуру. Я не думаю, что есть другой способ. –

+4

Если я правильно понимаю вас, то каждый ответ здесь неправильный. 'obj [Object.keys (obj) [1]]' возвращает значение свойства в индексе 1: '[4, 5, 6, 7, 8]' –

+0

http: // stackoverflow.com/questions/9768150/how-to-access-fields-in-json-object-by-index/39303950 # 39303950 –

ответ

25

Объекты в JavaScript - это коллекции неупорядоченные объектов недвижимости. Объекты - hashtables.

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

Вот быстрая адаптация для объекта :

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, что может быть проще.


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

+1

Это один сложный ответ, который вы получили там :) Однако, разве вы не должны делать проверку 'hasOwnProperty' внутри цикла for for? (В случае, если что-то расширило объект Object.prototype.) –

+0

@ Šime Vidas: Да, не хотелось слишком усложнять этот пример ... Но хорошая идея. Я обновлю этот ответ, и это с запиской об этом. –

+2

'obj [Object.keys (obj) [1]]' works ... 'Object.keys (obj) [0]' возвращает '" set1 "', тогда вы просто переходите в свойство accessor, как обычно. –

0

Нет «второго имущества» - когда вы говорите var obj = { ... }, свойства внутри фигурных скобок неупорядочены. Даже цикл «для», проходящий через них, может возвращать их в разных порядках в разных реализациях JavaScript.

17

Нет, нет доступа к элементу по индексу в объектах 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

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

var lookup = []; 
var i = 0; 

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

lookup[2] ... 

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

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

этот паскаль? – manix

13

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

+2

Jeroen, это настолько пятно. Это то, что мне нужно сегодня вечером. Спасибо, что нашли время, чтобы опубликовать свой ответ на этот старый вопрос. –

5

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

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

Jeroen Vervaeke «s ответ является модульным и отлично работает, но can cause problems, если он используется с JQuery или другими библиотеками, которые рассчитывают на„объект-как-HashTables“особенность JavaScript.

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

function getByIndex(obj, index) { 
    return obj[Object.keys(obj)[index]]; 
} 
Смежные вопросы