Доступ к нечисловым свойствам объекта по индексу?


если у меня есть такой массив:

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 53

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

С помощью jQuery вы можете сделать это:

var arr = $.map(obj,function(value, key) {
    return value;
});
alert(obj[0]);

получить массив ключей, отменить его, а затем запустить цикл

  var keys = Object.keys( obj ).reverse();
  for(var i = 0; i < keys.length; i++){
    var key = keys[i];
    var value = obj[key];
    //do stuff backwards
  }