Acessar propriedades não numéricas do objeto por índice?

88

Se eu tiver uma matriz como esta:

var arr = ['one','two','three'];

Posso acessar diferentes partes fazendo isto:

console.log(arr[1]);

Como posso acessar as propriedades do objeto por sua ordem em vez de por chave?

Exemplo:

var obj = {
    'something' : 'awesome',
    'evenmore'  : 'crazy'
},
jbo = {
    'evenmore'  : 'crazy',
    'something' : 'awesome'
};

Como obteria a primeira propriedade para cada objeto - "algo" de obje "ainda mais" de jbo- sem usar explicitamente o nome da propriedade?

Agora, alguns de vocês parecem pensar que estou atrás de algo como:

console.log(obj['something']);

Este não é o caso, estou procurando especificamente direcionar o índice, assim como o primeiro exemplo - se for possível.

daryl
fonte
2
O que você quer dizer com "Matriz de objetos". Uma matriz é um objeto. Você quer dizer apenas um objeto que não é uma matriz ou uma matriz de objetos. E como o jQuery influencia a sua pergunta? Seu único exemplo de código ilustra a parte que você já sabe fazer. Que tal fornecer algum código que ilustre o problema .
user113716
@ Ӫ _._ Ӫ O motivo pelo qual marquei o jQuery é para obter um público mais amplo, imaginei que qualquer pessoa que conheça jQuery deve ter uma compreensão de array, para não contradizer minha pergunta, é material didático.
daryl
4
Na verdade, eu diria que há mais pessoas "conhecendo" jQuery e não conhecendo JavaScript do que vice-versa (pelo menos as pessoas que conhecem JavaScript devem ser capazes de entender jQuery facilmente) ... e com relação à sua pergunta real: Não, você não pode acessar propriedades objec por índice. Eles não são ordenados.
Felix Kling
2
"... Achei que qualquer um que conhece jQuery deve ter uma compreensão de array ..." Eu não apostaria nisso.
user113716
1
@Brogrammer: esta questão não tem nada a ver com jQuery, então a tag jQuery é inadequada.
outis 23/10/11

Respostas:

127

"Estou procurando especificamente direcionar o índice, assim como o primeiro exemplo - se for possível."

Não, não é possível.

O mais próximo que você pode obter é obter um Array das chaves do objeto e usar isso:

var keys = Object.keys( obj );

... mas não há garantia de que as chaves serão devolvidas na ordem que você definiu. Então, pode acabar parecendo:

keys[ 0 ];  // 'evenmore'
keys[ 1 ];  // 'something'
user113716
fonte
6
Object.keys()pode ser usado de forma confiável se você souber o conteúdo do objeto. Mais detalhes aqui: stackoverflow.com/questions/280713/…
cronoklee
3
O método Object.keys () retorna uma matriz das propriedades enumeráveis ​​de um determinado objeto, na mesma ordem fornecida por um loop for ... in (a diferença é que um loop for-in enumera propriedades na cadeia de protótipo como bem). developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Amr Ragaey
6
tudo é possível
Cas Bloem
48

A única maneira que consigo pensar em fazer isso é criando um método que forneça a propriedade using Object.keys();.

var obj = {
    dog: "woof",
    cat: "meow",
    key: function(n) {
        return this[Object.keys(this)[n]];
    }
};
obj.key(1); // "meow"

Demo: http://jsfiddle.net/UmkVn/

Seria possível estender isso a todos os objetos usando Object.prototype; mas isso geralmente não é recomendado.

Em vez disso, use um auxiliar de função:

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
0x499602D2
fonte
1
Isso é legal e funciona como um encanto! Por que não é a resposta aceita? Você provavelmente deve usar return this[Object.keys(this)[n]];para torná-lo genérico.
cronoklee de
3
Olá de 2016, nós, futuros, ainda achamos que essa deve ser a resposta aceita. Ótima solução
mhodges
A razão pela qual não é a resposta aceita é porque até es6, a ordem de Object.keys não é garantida. Portanto, embora esse código funcione em alguns mecanismos JS, não é garantido que funcione em todos eles. stackoverflow.com/questions/5525795/…
ptoinson
13

Você pode usar o Object.values()método se não quiser usar o Object.keys().

Ao contrário do Object.keys()método que retorna uma matriz das propriedades enumeráveis ​​de um determinado objeto, por exemplo:

const object1 = {
 a: 'somestring',
 b: 42,
 c: false
};

console.log(Object.keys(object1));

Imprime a seguinte matriz:

[ 'a', 'b', 'c' ]

O Object.values()método retorna uma matriz da propriedade enumerável de um determinado objeto values.

Portanto, se você tiver o mesmo objeto, mas usar valores em vez disso,

const object1 = {
 a: 'somestring',
 b: 42,
 c: false
};

console.log(Object.values(object1));

Você obteria a seguinte matriz:

[ 'somestring', 42, false ]

Portanto, se você quiser acessar o object1.b, mas usando um índice, poderá usar:

Object.values(object1)[1] === 42

Você pode ler mais sobre este método aqui .

Arthur Senna
fonte
1
Este método dentro do sugerido neste tópico parece ser o mais curto e o mais elegante.
Petro Franko
5
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)

Editar:

"Estou procurando especificamente direcionar o índice, assim como o primeiro exemplo - se for possível."

Na verdade, o 'índice' é a chave. Se você deseja armazenar a posição de uma chave, você precisa criar um objeto personalizado para lidar com isso.

Cuzzea
fonte
Eu sei que você pode acessá-lo pela chave, não era isso que eu estava perguntando.
daryl
@Brogrammer: sua pergunta é ambígua, então este post potencialmente responde à pergunta como foi escrita.
outis 23/10/2011
2

por jquery você pode fazer isso:

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

Pegue a matriz de chaves, inverta-a e execute seu loop

  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
  }
Kareem
fonte
1

você pode criar uma matriz que preenche os campos do seu objeto e usar um índice na matriz e acessar as propriedades do objeto por meio desse

propertiesName:['pr1','pr2','pr3']

this.myObject[this.propertiesName[0]]
Arfa
fonte
1

Eu fui em frente e fiz uma função para você:

 Object.prototype.getValueByIndex = function (index) {
     /*
         Object.getOwnPropertyNames() takes in a parameter of the object, 
         and returns an array of all the properties.
         In this case it would return: ["something","evenmore"].
         So, this[Object.getOwnPropertyNames(this)[index]]; is really just the same thing as:
         this[propertyName]
    */
    return this[Object.getOwnPropertyNames(this)[index]];
};

let obj = {
    'something' : 'awesome',
    'evenmore'  : 'crazy'
};

console.log(obj.getValueByIndex(0)); // Expected output: "awesome"

StackGeek
fonte
1
Você poderia explicar o que está sendo feito em sua abordagem?
Rahul Bhobe
Adicionei alguns comentários no código, para que você pudesse entender o que está sendo feito.
StackGeek de
0

Se você não tiver certeza de que Object.keys () retornará as chaves na ordem certa, você pode tentar esta lógica

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]])
Thiago Loddi
fonte