Доступ к нечисловым свойствам объекта по индексу?
Если у меня есть такой массив:
var arr = ['one','two','three'];
Я могу получить доступ к различным частям, выполнив следующие действия:
console.log(arr[1]);
Как я могу получить доступ к свойствам объекта по их порядку, а не по ключу?
Пример:
var obj = {
'something' : 'awesome',
'evenmore' : 'crazy'
},
jbo = {
'evenmore' : 'crazy',
'something' : 'awesome'
};
Как мне получить первое свойство для каждого объекта - "нечто" из obj
и "evenmore" из jbo
- без явного использования имени свойства?
Теперь некоторые из вас, кажется, думают, что я за чем-то вроде:
console.log(obj['something']);
Это не тот случай, я специально нацелен на индекс, как и в первом примере - если это возможно.
Ответы
Ответ 1
"Я специально планирую нацелить индекс, как и на первый пример - если это возможно".
Нет, это невозможно.
Самое близкое, что вы можете получить, это получить массив ключей объектов и использовать его:
var keys = Object.keys( obj );
... но нет гарантии, что ключи будут возвращены в указанном вами порядке. Таким образом, это может выглядеть так:
keys[ 0 ]; // 'evenmore'
keys[ 1 ]; // 'something'
Ответ 2
Единственный способ, которым я могу это сделать, - создать метод, который дает вам свойство с помощью Object.keys();
.
var obj = {
dog: "woof",
cat: "meow",
key: function(n) {
return this[Object.keys(this)[n]];
}
};
obj.key(1); // "meow"
Демо: http://jsfiddle.net/UmkVn/
Можно было бы распространить это на все объекты с помощью Object.prototype;
, но это обычно не рекомендуется.
Вместо этого используйте вспомогательный элемент функции:
var object = {
key: function(n) {
return this[ Object.keys(this)[n] ];
}
};
function key(obj, idx) {
return object.key.call(obj, idx);
}
key({ a: 6 }, 0); // 6
Ответ 3
var obj = {
'key1':'value',
'2':'value',
'key 1':'value'
}
console.log(obj.key1)
console.log(obj['key1'])
console.log(obj['2'])
console.log(obj['key 1'])
// will not work
console.log(obj.2)
Edit:
"Я специально планирую нацелить индекс, как и на первый пример - если это возможно".
Фактически "индекс" - это ключ. Если вы хотите сохранить позицию ключа, вам нужно создать пользовательский объект для его обработки.
Ответ 4
Если вы не уверены, что Object.keys() вернет вам ключи в правильном порядке, вы можете попробовать эту логику вместо
var keys = []
var obj = {
'key1' : 'value1',
'key2' : 'value2',
'key3' : 'value3',
}
for (var key in obj){
keys.push(key)
}
console.log(obj[keys[1]])
console.log(obj[keys[2]])
console.log(obj[keys[3]])
Ответ 5
jquery вы можете сделать это:
var arr = $.map(obj,function(value, key) {
return value;
});
alert(obj[0]);