Obtendo o nome da propriedade do objeto

179

Eu queria saber se havia alguma maneira no JavaScript para percorrer um objeto como esse.

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

Mas obtenha o nome de cada propriedade assim.

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

Não consigo encontrar nada parecido no Google. Eles dizem para passar os nomes das variáveis ​​com eles, mas isso não é uma opção para o que estou tentando alcançar.

Obrigado por qualquer ajuda que você pode oferecer.

Olical
fonte
2
Duplicado de stackoverflow.com/questions/85992/…
wajiw 23/11
4
seperatedeveria serseparate
Juan Mendes
13
@JuanMendes Obrigado, corrigido. Uau, essa pergunta é uma explosão do passado. Eu percorri um 'l' + new Array(1000).join('o') + 'ng'caminho desde então.
Olical 24/05
1
resposta marcada está incorreta, use o método Object.keys ().
Kevin Florida
resposta verificada e a coisa Object.keys () faz coisas diferentes, portanto, dependendo do que você deseja, uma delas pode estar certa.
Gabe Johnson

Respostas:

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() fornece uma matriz de nomes de propriedades pertencentes ao objeto de entrada.

Trann
fonte
3
Mais especificamente, Object.keys (obj) retorna uma matriz de nomes de propriedades, ou seja, chaves, pertencentes ao passado em obj.
um aluno não tem nome
1
Adicionalmente, Object.keys () retornar apenas propriedades enumuable, Object.getOwnProperties () irá retornar todas as propriedades de TI
bitfishxyz
192

i É o nome.

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

Então você poderia fazer:

seperateObj[i] = myObject[i];
Josiah Ruddell
fonte
1
As propriedades do objeto podem ser acessadas através da sintaxe do colchete. obj.prop1 é o mesmo que obj ['prop1'].
Josias Ruddell
5
Uma boa prática é usar hasOwnProperty quando se usa for..in
Bakudan
5
A @Bakudan sabe o que você quer dizer, mas a melhor maneira de dizer isso é que você deve usar hasOwnPropertyse não quiser propriedades herdadas. Dessa forma, você não está seguindo cegamente alguma regra. Pode ser que, em alguns casos, você realmente queira examinar as propriedades herdadas. Outra maneira de percorrer as propriedades de um objeto é usando Object.keys . Object.keys(obj).forEach(function(prop){ alert obj[prop]})
Juan Mendes
@ Juan Mendes Sim, eu quis dizer o caso com propriedades herdadas. Eu sou forçado (infelizmente) para usar esta abordagem, porque IE8 não suporta Object.keys ...
Bakudan
17

Isenção de responsabilidade Eu entendi mal a pergunta: "Posso saber o nome da propriedade à qual um objeto foi anexado", mas optei por deixar a resposta, pois algumas pessoas podem parar aqui enquanto procuram por isso.


Não, um objeto pode ser anexado a várias propriedades, portanto, não há como saber seu nome.

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

Qual seria o nome do obj?

Tem certeza de que não deseja apenas o nome da propriedade do loop for?

for (var propName in obj) {
  console.log("Iterating through prop with name", propName, " its value is ", obj[propName])
}
Juan Mendes
fonte
@ChadSchouggins O que você disse é verdade, mas essa não é a pergunta que estou respondendo, porque sim, você pode percorrer um objeto para obter o nome de cada propriedade. Estou respondendo a uma pergunta que pode não ser o que o OP pretendia, só queria esclarecer que várias propriedades poderiam apontar para o mesmo objeto.
Juan Mendes
7

você pode iterar facilmente em objetos

por exemplo: se o objeto for var a = {a: 'maçã', b: 'bola', c: 'gato', d: 'boneca', 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
fonte
6

para acesso direto a uma propriedade de objeto por posição ... geralmente útil para a propriedade [0] ... então ela contém informações sobre o outro ... ou no node.js 'require.cache [0]' para o primeiro módulo externo carregado , etc etc.

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

Além de "Object.keys (obj)", temos um loop "for ... in" muito simples - que faz um loop sobre os numerosos nomes de propriedades de um 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
fonte
3

Para obter a propriedade do objeto ou a "chave da matriz" ou "índice da matriz", dependendo do idioma nativo ..... Use o método Object.keys ().

Importante, isso é compatível apenas com "Navegadores modernos":

Portanto, se seu objeto for chamado, myObject ...

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

Walla! Isso definitivamente funcionará no mais recente firefox e ie11 e chrome ...

Aqui está alguma documentação em MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

Kevin Florida
fonte
2

EM ES5

Por exemplo, você tem 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" }
};

E agora, se você deseja ter uma função que, se você passar '0' como um parâmetro - para obter 'STEP_ELEMENT', se '2' para obter 'BLUE_ELEMENT' e assim por

function(elementId) {
    var element = null;

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

    return element;
}

Provavelmente, essa não é a melhor solução para o problema, mas é bom dar uma idéia de como fazê-lo.

Felicidades.

Combinar
fonte
1

A partir de 2018, você poderá utilizá-lo Object.getOwnPropertyNames()conforme descrito na documentação do desenvolvedor Mozilla

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

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

Quando você executa o loop for / in que você coloca primeiro, i é o nome da propriedade. Então você tem o nome da propriedade, i, e acessa o valor executando myObject [i].

mmurch
fonte
0

Essas soluções também funcionam.

// 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
fonte
0

O uso da Object.keys()função para adquirir propriedades de um Objecte pode ajudar a procurar propriedades por nome, por exemplo:

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

Rápido e sujo:

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