Доступ к нечисловым свойствам объекта по индексу?
если у меня есть такой массив:
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']);
это не так, я специально ищу целевой индекс, как и в первом примере - если это возможно.
7 ответов:
" Я специально ищу целевой индекс, как и в первом примере-если это возможно."
нет, это невозможно.
самое близкое, что вы можете получить, это получить массив ключей объекта и использовать его:
var keys = Object.keys( obj );
...но нет никакой гарантии, что ключи будут возвращены в заданном порядке. Так что это может выглядеть так:
keys[ 0 ]; // 'evenmore' keys[ 1 ]; // 'something'
единственный способ, которым я могу думать об этом, - это создать метод, который дает вам свойство с помощью
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;
но это обычно не рекомендуется.вместо этого используйте функцию helper:
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
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:
на самом деле "индекс" является ключевым. Если вы хотите сохранить положение ключа вам нужно создать пользовательский объект, чтобы справиться с этим.
можно использовать
Object.values()
способ если вы не хотите использоватьObject.keys()
.в отличие от
Object.keys()
метод, который возвращает массив собственных перечислимых свойств данного объекта, например:const object1 = { a: 'somestring', b: 42, c: false }; console.log(Object.keys(object1));
выведет следующий массив:
[ 'a', 'b', 'c' ]
The
Object.values()
метод возвращает массив собственного перечисляемого свойства данного объектаvalues
.так что если у вас один и тот же объект, но использовать значения вместо
const object1 = { a: 'somestring', b: 42, c: false }; console.log(Object.values(object1));
вы получите следующий массив:
[ 'somestring', 42, false ]
так что если вы хотите получить доступ к
object1.b
, но с помощью индекса вместо этого вы можете использовать:Object.values(object1)[1] === 42
вы можете узнать больше об этом методе здесь.
Если вы не уверены объекта.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]])