Obtener el nombre de propiedad del objeto

179

Me preguntaba si en JavaScript había alguna forma de recorrer un objeto así.

for(var i in myObject) {
    // ...
}

Pero obtenga el nombre de cada propiedad de esta manera.

for(var i in myObject) {
    separateObj[myObject[i].name] = myObject[i];
}

Parece que no puedo encontrar algo así en Google. Dicen que deben pasar los nombres de las variables con ellos, pero esta no es una opción para lo que estoy tratando de lograr.

Gracias por cualquier ayuda que pueda ofrecer.

Olical
fuente
2
Duplicado de stackoverflow.com/questions/85992/…
wajiw el
44
seperatedebería serseparate
Juan Mendes
13
@JuanMendes Gracias, corregido. Wow, esta pregunta es una explosión del pasado. He recorrido un 'l' + new Array(1000).join('o') + 'ng'camino desde entonces.
Olical
1
la respuesta marcada es incorrecta, use el método Object.keys ().
Kevin Florida
la respuesta marcada y el objeto Object.keys () hacen cosas diferentes, por lo que, dependiendo de lo que desee, cualquiera de los dos puede ser correcto.
Gabe Johnson

Respuestas:

163

Use Object.keys ():

var myObject = { a: 'c', b: 'a', c: 'b' };
var keyNames = Object.keys(myObject);
console.log(keyNames); // Outputs ["a","b","c"]

Object.keys() le proporciona una matriz de nombres de propiedades que pertenecen al objeto de entrada.

Trann
fuente
3
Más específicamente, Object.keys (obj) devuelve una matriz de nombres de propiedades, es decir, claves, que pertenecen al obj pasado.
un alumno no tiene nombre
1
Además, Object.keys () solo devuelve propiedades enumerables, Object.getOwnProperties () devolverá todas sus propiedades
bitfishxyz
192

i es el nombre.

for(var name in obj) {
    alert(name);
    var value = obj[name];
    alert(value);
}

Entonces podrías hacer:

seperateObj[i] = myObject[i];
Josiah Ruddell
fuente
1
Se puede acceder a las propiedades de los objetos a través de la sintaxis de paréntesis. obj.prop1 es lo mismo que obj ['prop1'].
Josiah Ruddell el
55
Una buena práctica es usar HasOwnProperty cuando se usa para..in
Bakudan
55
@Bakudan sabe lo que quiere decir, pero una mejor manera de decirlo es que debe usarlo hasOwnPropertysi no desea propiedades heredadas. De esa manera no estás siguiendo ciegamente alguna regla. Puede ser que, en algunos casos, realmente desee ver las propiedades heredadas. Otra forma de recorrer las propias propiedades de un objeto es usar Object.keys . Object.keys(obj).forEach(function(prop){ alert obj[prop]})
Juan Mendes
@Juan Mendes Sí, me refería al caso de las propiedades heredadas. Me veo obligado (tristemente) a usar este enfoque, porque IE8 no admite Object.keys ...
Bakudan
17

Descargo de responsabilidad Entendí mal la pregunta: "¿Puedo saber el nombre de la propiedad a la que se adjuntó un objeto", pero decidí dejar la respuesta ya que algunas personas pueden terminar aquí mientras lo buscan.


No, un objeto podría estar asociado a varias propiedades, por lo que no tiene forma de saber su nombre.

var obj = {a:1};
var a = {x: obj, y: obj}

¿Cuál sería el nombre de obj?

¿Estás seguro de que no solo quieres el nombre de la propiedad del ciclo for?

for (var propName in obj) {
  console.log("Iterating through prop with name", propName, " its value is ", obj[propName])
}
Juan mendes
fuente
@ChadSchouggins Lo que dijiste es cierto, pero esa no es la pregunta que estoy respondiendo, porque sí, puedes recorrer un objeto para obtener cada nombre de propiedad. Estoy respondiendo una pregunta que puede no ser lo que pretendía el OP, solo quería aclarar que varias propiedades podrían apuntar al mismo objeto.
Juan Mendes
7

puedes iterar fácilmente en objetos

por ejemplo: si el objeto es var a = {a: 'manzana', b: 'pelota', c: 'gato', d: 'muñeca', e: 'elefante'};

Object.keys(a).forEach(key => {
   console.log(key) // returns the keys in an object
   console.log(a[key])  // returns the appropriate value 
})
Akhil Aravind
fuente
6

para el acceso directo a una propiedad de un objeto por posición ... generalmente útil para la propiedad [0] ... por lo que contiene información sobre más ... o en node.js 'require.cache [0]' para el primer módulo externo cargado , etcétera etcétera.

Object.keys( myObject )[ 0 ]
Object.keys( myObject )[ 1 ]
...
Object.keys( myObject )[ n ]
ZEE
fuente
4

Aparte de "Object.keys (obj)", tenemos un bucle muy simple "for ... in", que recorre los nombres de propiedades enumerables de un objeto.

const obj = {"fName":"John","lName":"Doe"};

for (const key in obj) {
    //This will give key
      console.log(key);
    //This will give value
    console.log(obj[key]);
    
}

Nikhil Vats
fuente
3

Para obtener la propiedad del objeto o la "clave de matriz" o el "índice de matriz" dependiendo de cuál sea su idioma nativo ..... Utilice el método Object.keys ().

Importante, esto solo es compatible con los "navegadores modernos":

Entonces, si se llama a su objeto, myObject ...

var c = 0;
for(c in myObject) {
    console.log(Object.keys(myObject[c]));
}

Walla! Esto definitivamente funcionará en la última versión de Firefox y ie11 y Chrome ...

Aquí hay alguna documentación en MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

Kevin Florida
fuente
2

EN ES5

Por ejemplo, tienes este tipo de objeto:

var ELEMENTS = {
    STEP_ELEMENT: { ID: "0", imageName: "el_0.png" },
    GREEN_ELEMENT: { ID: "1", imageName: "el_1.png" },
    BLUE_ELEMENT: { ID: "2", imageName: "el_2.png" },
    ORANGE_ELEMENT: { ID: "3", imageName: "el_3.png" },
    PURPLE_ELEMENT: { ID: "4", imageName: "el_4.png" },
    YELLOW_ELEMENT: { ID: "5", imageName: "el_5.png" }
};

Y ahora, si desea tener una función que si pasa '0' como parámetro, para obtener 'STEP_ELEMENT', si '2' para obtener 'BLUE_ELEMENT' y así

function(elementId) {
    var element = null;

    Object.keys(ELEMENTS).forEach(function(key) {
        if(ELEMENTS[key].ID === elementId.toString()){
            element = key;
            return;
        }    
    });

    return element;
}

Probablemente esta no sea la mejor solución al problema, pero es bueno darle una idea de cómo hacerlo.

Salud.

Combinar
fuente
1

A partir de 2018, puede utilizar Object.getOwnPropertyNames()como se describe en Documentación de Mozilla para desarrolladores

const object1 = {
  a: 1,
  b: 2,
  c: 3
};

console.log(Object.getOwnPropertyNames(object1));
// expected output: Array ["a", "b", "c"]
Aaqib
fuente
0

Cuando haces el bucle for / in que colocas primero, i es el nombre de la propiedad. Entonces tiene el nombre de propiedad, i, y accede al valor haciendo myObject [i].

mmurch
fuente
0

Estas soluciones también funcionan.

// Solution One
function removeProperty(obj, prop) {
  var bool;
  var keys = Object.keys(obj);
  for (var i = 0; i < keys.length; i++) {
    if (keys[i] === prop) {
      delete obj[prop];
      bool = true;
    } 
  }
  return Boolean(bool);
}


//Solution two
function removeProperty(obj, prop) {
  var bool;
  if (obj.hasOwnProperty(prop)) {
      bool = true;
      delete obj[prop];
  }
  return Boolean(bool);
}
ekbgh
fuente
0

Usando la Object.keys()función para adquirir propiedades de un Object, y puede ayudar a buscar propiedades por nombre, por ejemplo:

const Products = function(){
    this.Product = "Product A";
    this.Price = 9.99;
    this.Quantity = 112;
};

// Simple find function case insensitive
let findPropByName = function(data, propertyName){
 let props = [];
 Object.keys(data).forEach(element => {
    return props.push(element.toLowerCase());
  });
  console.log(props);
  let i = props.indexOf(propertyName.toLowerCase());

  if(i > -1){
    return props[i];
  }
  return false;
};

// calling the function
let products = new Products();
console.log(findPropByName(products, 'quantity'));
Ashraf Abusada
fuente
-1

Rápido y sucio:

function getObjName(obj) {
  return (wrap={obj}) && eval('for(p in obj){p}') && (wrap=null);
}
David
fuente