¿Acceder a propiedades de objetos no numéricos por índice?

88

Si tengo una matriz como esta:

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

Puedo acceder a diferentes partes haciendo esto:

console.log(arr[1]);

¿Cómo puedo acceder a las propiedades del objeto por su orden en lugar de por clave?

Ejemplo:

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

¿Cómo obtendría la primera propiedad para cada objeto - "algo" de obje "incluso más" de - jbosin usar explícitamente el nombre de la propiedad?

Ahora, algunos de ustedes parecen pensar que estoy detrás de algo como:

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

Este no es el caso, estoy buscando específicamente apuntar al índice, al igual que en el primer ejemplo, si es posible.

daryl
fuente
2
¿Qué quieres decir con "matriz de objetos". Una matriz es un objeto. ¿Te refieres a un objeto que no es una matriz, o te refieres a una matriz de objetos? ¿Y cómo influye jQuery en tu pregunta? Su único ejemplo de código ilustra la parte que ya sabe cómo hacer. ¿Qué tal dar un código que ilustre el problema ?
user113716
@ Ӫ _._ Ӫ La razón por la que etiqueté a jQuery es para obtener una audiencia más amplia, pensé que cualquiera que conozca jQuery debe tener una comprensión de las matrices, para no contradecir mi pregunta, son cosas de libros de texto.
daryl
4
En realidad, diría que hay más personas que "conocen" jQuery y no saben JavaScript que viceversa (al menos las personas que conocen JavaScript deberían poder entender jQuery fácilmente) ... y con respecto a su pregunta real: No, usted no puede acceder a las propiedades del objeto por índice. No están ordenados.
Felix Kling
2
"... Supuse que cualquiera que conozca jQuery debe tener un conocimiento de las matrices ..." No apostaría por eso.
user113716
1
@Brogrammer: esta pregunta no tiene nada que ver con jQuery, por lo que la etiqueta jQuery es inapropiada.
salida el

Respuestas:

125

"Estoy buscando específicamente apuntar al índice, como en el primer ejemplo, si es posible".

No, no es posible.

Lo más cercano que puede obtener es obtener una matriz de las claves del objeto y usarla:

var keys = Object.keys( obj );

... pero no hay garantía de que las claves se devuelvan en el orden que definió. Entonces podría terminar pareciendo:

keys[ 0 ];  // 'evenmore'
keys[ 1 ];  // 'something'
usuario113716
fuente
6
Object.keys()podría usarse de manera confiable si conoce el contenido del objeto. Más detalles aquí: stackoverflow.com/questions/280713/…
cronoklee
3
El método Object.keys () devuelve una matriz de las propiedades enumerables propias de un objeto dado, en el mismo orden que el proporcionado por un bucle for ... in (la diferencia es que un bucle for-in enumera las propiedades en la cadena del prototipo como bien). developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Amr Ragaey
6
todo es posible
Cas Bloem
48

La única forma en que puedo pensar en hacer esto es creando un método que le proporcione la propiedad using Object.keys();.

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

Demostración: http://jsfiddle.net/UmkVn/

Sería posible extender esto a todos los objetos que usan, Object.prototype;pero generalmente no se recomienda.

En su lugar, use una función auxiliar:

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
fuente
1
¡Esto es genial y funciona como un encanto! ¿Por qué no es la respuesta aceptada? Probablemente debería usar return this[Object.keys(this)[n]];para hacerlo genérico.
cronoklee
3
Hola desde 2016, nosotros, la gente del futuro, todavía creemos que esta debería ser la respuesta aceptada. Gran solución
mhodges
La razón por la que no es la respuesta aceptada es porque hasta es6, el orden de Object.keys no está garantizado. Por lo tanto, aunque ese código funciona en algunos motores JS, no se garantiza que funcione en todos ellos. stackoverflow.com/questions/5525795/…
ptoinson
13

Puede utilizar el Object.values()método si no desea utilizar elObject.keys() .

A diferencia del Object.keys()método que devuelve una matriz de las propiedades enumerables propias de un objeto dado, por ejemplo:

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

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

Imprimiría la siguiente matriz:

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

El Object.values()método devuelve una matriz de la propiedad enumerable propia de un objeto dado.values .

Entonces, si tiene el mismo objeto pero usa valores en su lugar,

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

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

Obtendría la siguiente matriz:

[ 'somestring', 42, false ]

Entonces, si desea acceder al object1.b , pero usando un índice en su lugar, puede usar:

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

Puede leer más sobre este método aquí .

Arthur Senna
fuente
1
Este método dentro del sugerido en este tema parece ser el más corto y el más 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:

"Estoy buscando específicamente apuntar al índice, como en el primer ejemplo, si es posible".

En realidad, el 'índice' es la clave. Si desea almacenar la posición de una clave, debe crear un objeto personalizado para manejar esto.

cuzzea
fuente
Sé que puedes acceder a él con la clave, eso no es lo que estaba preguntando.
daryl
@Brogrammer: su pregunta es ambigua, por lo que esta publicación potencialmente responde a la pregunta tal como está escrita.
salida el
2

por jquery puedes hacer esto:

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

Obtenga la matriz de claves, inviértala, luego ejecute su ciclo

  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
fuente
1

puede crear una matriz que se llene con los campos de su objeto y usar un índice en la matriz y acceder a las propiedades del objeto a través de eso

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

this.myObject[this.propertiesName[0]]
arfa
fuente
1

Seguí adelante e hice una función para ti:

 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
fuente
1
¿Podría explicar qué se está haciendo en su enfoque?
Rahul Bhobe
Agregué algunos comentarios en el código para que pueda comprender lo que se está haciendo.
StackGeek
0

Si no está seguro de que Object.keys () le devolverá las claves en el orden correcto, puede probar esta lógica en su lugar

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
fuente