2011-10-23 24 views
48

Si tengo una matriz de esta manera:¿Acceder a propiedades de objeto no numéricas por índice?

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

que puede acceder a las diferentes partes al hacer esto:

console.log(arr[1]); 

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

Ejemplo:

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

¿Cómo voy a conseguir la primera propiedad para cada "algo" a objetos de obj y "evenmore" de jbo -sin explícitamente utilizando el nombre de la propiedad?

Ahora, algunos de ustedes parecen pensar que soy después de algo como:

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

Este no es el caso, estoy buscando específicamente para cumplir con el índice, al igual que el primer ejemplo - si Es posible.

+2

¿Qué quiere decir con "matriz de objetos". Una matriz * es * un objeto. ¿Te refieres solo a un objeto que no es una matriz, o te refieres a una serie de objetos? ¿Y cómo jQuery tiene en cuenta tu pregunta? Su único ejemplo de código ilustra la parte que ya sabe cómo hacer. ¿Qué le parece dar un código que ilustre el * problema *? – user113716

+0

@ Ӫ _._ Ӫ La razón por la que etiqueté jQuery es para conseguir un público más amplio, calculé que cualquiera que conozca jQuery debe tener una comprensión de los arreglos, no para contradecir mi pregunta, es material de libros de texto. – daryl

+3

En realidad, diría que hay más personas que "conocen" jQuery y no conocen JavaScript que viceversa (al menos las personas que conocen JavaScript deberían ser capaces de entender jQuery fácilmente) .... y con respecto a su pregunta real: No, no puede acceder a las propiedades de objec por índice. No están ordenados –

Respuesta

72

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

No, no es posible.

Lo más cerca que se puede obtener es conseguir una matriz de claves del objeto, y el uso que:

var keys = Object.keys(obj); 

... pero no hay garantía de que las llaves se devuelven en el orden que ha definido. Por lo que podría terminar pareciéndose a:

keys[ 0 ]; // 'evenmore' 
keys[ 1 ]; // 'something' 
+3

'Object.keys()' podría usarse de manera confiable si conoce el contenido del objeto. Más detalles aquí: http://stackoverflow.com/questions/280713/elements-order-in-a-for-in-loop – cronoklee

+1

El método Object.keys() devuelve una matriz de las propias propiedades enumerables de un objeto dado, en el el mismo orden que el proporcionado por un bucle for ... in (la diferencia es que un bucle for-in también enumera propiedades en la cadena del prototipo). https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys –

2
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 para cumplir con el índice, al igual que el primer ejemplo - si es posible."

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

+0

Sé que se puede acceder por la clave, eso no es lo que estaba preguntando. – daryl

+0

@Brogrammer: su pregunta es ambigua, por lo que esta publicación posiblemente responda la pregunta tal como está escrita. – outis

+0

bien, luego explique más – cuzzea

34

La única manera que puedo pensar de hacer esto es mediante la creación de un método que proporciona la propiedad utilizando 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 utilizan Object.prototype; pero eso no se recomienda normalmente.

su lugar, utilice 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 
+1

Esto es genial y funciona como un encanto! ¿Por qué no es la respuesta aceptada? Probablemente deberías usar 'return this [Object.keys (this) [n]];' para hacerlo genérico. – cronoklee

+1

Hola desde 2016, la gente del futuro todavía piensa que esta debería ser la respuesta aceptada. Gran solución – mhodges

+0

La razón por la cual no es la respuesta aceptada es porque hasta es6, el orden de Object.keys no está garantizado. Entonces, aunque ese código funciona en algunos motores JS, no se garantiza que funcione en todos ellos. https://stackoverflow.com/questions/5525795/does-javascript-guarantee-object-property-order – ptoinson

0

Si no está seguro de objetos.teclas() va a devolver las llaves en el orden correcto, puede probar esta lógica en 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]]) 
0

por jQuery se puede hacer esto:

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

Usted puede utilizar el método Object.values() si no quiero usar el Object.keys().

En oposición al método Object.keys() que devuelve una matriz de propias propiedades enumerables de un objeto dado, así por ejemplo:

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

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

imprimiría la siguiente matriz:

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

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

Así que si usted tiene el mismo objeto, pero utiliza valores de cambio,

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

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

Obtendría la siguiente matriz:

[ 'somestring', 42, false ] 

Así que si quería acceder a la object1.b, pero utilizando un índice en su lugar, puede usar:

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

Puede leer más acerca de este método here.

Cuestiones relacionadas