Nesnenin özellik adını alma


179

JavaScript böyle bir nesne ile döngü için herhangi bir yolu olup olmadığını merak ediyordum.

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

Ancak böyle her mülkün adını alın.

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

Google'da böyle bir şey bulamıyorum. Değişkenlerin isimlerini onlarla geçmeyi söylüyorlar, ancak bu elde etmeye çalıştığım şey için bir seçenek değil.

Sunabileceğiniz herhangi bir yardım için teşekkürler.



4
seperateolmalıseparate
Juan Mendes

13
@JuanMendes Teşekkürler, düzeltildi. Vay be, bu soru geçmişten gelen bir patlama. 'l' + new Array(1000).join('o') + 'ng'O zamandan beri bir yol geldim .
Olical

1
işaretli cevap yanlış, Object.keys () yöntemini kullanın.
Kevin Florida

işaretli cevap ve Object.keys () şey farklı şeyler yapar, bu yüzden ne istediğinize bağlı olarak, her ikisi de doğru olabilir.
Gabe Johnson

Yanıtlar:


163

Object.keys () öğesini kullanın :

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

Object.keys() size giriş nesnesine ait bir dizi özellik adı verir.


3
Daha spesifik olarak, Object.keys (obj), obj içinde iletilene ait bir dizi özellik adı, yani anahtarlar döndürür.
bir öğrencinin adı

1
Ek olarak, Object.keys () sadece sayılabilir özellikleri döndürür, Object.getOwnProperties () tüm özelliklerini döndürür
bitfishxyz

192

i ismi.

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

Böylece şunları yapabilirsiniz:

seperateObj[i] = myObject[i];

1
Nesne özelliklerine köşeli parantez sözdizimi ile erişilebilir. obj.prop1 obj ['prop1'] ile aynıdır.
Josiah Ruddell

5
İyi bir uygulama kullanımı için hasOwnProperty For..in kullanırken
Bakudan

5
@Bakudan ne demek istediğinizi biliyor, ancak daha iyi bir yol, hasOwnPropertymiras alınan özellikler istemiyorsanız kullanmanız gerektiğidir . Bu şekilde bir kurala körü körüne uymuyorsunuz. Bazı durumlarda aslında kalıtsal özelliklere bakmak isteyebilirsiniz. Bir nesnenin kendi özellikleri arasında geçiş yapmanın başka bir yolu, Object.keys kullanmaktır . Object.keys(obj).forEach(function(prop){ alert obj[prop]})
Juan Mendes

@Juan Mendes Evet, kalıtsal özellikleri olan durumu kastediyorum. Ben IE8 ... Object.keys desteklemediği için (ne yazık ki), bu yaklaşımı kullanmak zorunda değilim
Bakudan

17

Feragatname Soruyu şu şekilde yanlış anladım: "Bir nesnenin bağlı olduğu mülk adını bilebilir miyim?", Ancak bazı insanlar bunu ararken burada bitebileceğinden cevabı bırakmayı seçti.


Hayır, bir nesne birden çok özelliğe eklenebilir, bu nedenle adını bilmenin bir yolu yoktur.

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

Obj'in adı ne olurdu?

For döngüsünden sadece özellik adını istemediğinizden emin misiniz?

for (var propName in obj) {
  console.log("Iterating through prop with name", propName, " its value is ", obj[propName])
}

@ChadSchouggins Söyledikleriniz doğru, ama cevapladığım soru bu değil, çünkü evet, her özellik adını almak için bir nesne arasında döngü yapabilirsiniz. OP'nin amaçladığı gibi olmayan bir soruya cevap veriyorum, sadece birden çok özelliğin aynı nesneye işaret edebileceğini netleştirmek istedim.
Juan Mendes

7

nesnelerde kolayca yineleyebilirsiniz

örneğin: nesne var ise a = {a: 'elma', b: 'top', c: 'kedi', d: 'bebek', e: 'fil'};

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

6

bir nesne özelliğine konuma göre doğrudan erişim için ... genellikle [0] özelliği için faydalıdır ... bu nedenle daha fazla bilgi içerir ... veya ilk yüklenen harici modül için node.js 'requir.cache [0]' da bilgi tutar , vs vs.

Object.keys( myObject )[ 0 ]
Object.keys( myObject )[ 1 ]
...
Object.keys( myObject )[ n ]

4

"Object.keys (obj)" dışında, bir nesnenin numaralandırılabilir özellik adları üzerinde dolaşan çok basit "for ... in" döngüsüne sahibiz.

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]);
    
}


3

Yerel dilinizin ne olduğuna bağlı olarak nesnenin veya "dizi anahtarı" veya "dizi dizini" özelliğini almak için ..... Object.keys () yöntemini kullanın.

Önemli, bu yalnızca "Modern tarayıcılar" ile uyumludur:

Nesneniz çağrılırsa, myObject ...

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

Walla! Bu kesinlikle en son firefox ve ie11 ve kromda çalışacak ...

İşte MDN'deki bazı belgeler https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys


2

ES5'TE

EG bu tür nesneleriniz var:

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" }
};

Ve şimdi eğer bir işlev olarak '0' iletirseniz - 'STEP_ELEMENT' almak için '2' ise 'BLUE_ELEMENT' almak için bir işleve sahip olmak istiyorsanız

function(elementId) {
    var element = null;

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

    return element;
}

Bu muhtemelen sorunun en iyi çözümü değil, nasıl yapılacağına dair bir fikir vermek iyidir.

Şerefe.


1

2018 itibariyle, Geliştirici Mozilla Belgeleri'ndeObject.getOwnPropertyNames() açıklandığı gibi kullanabilirsiniz

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

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

0

İlk koyduğunuz for / in döngüsünü yaptığınızda, i özellik adıdır. Yani, i özellik adına sahipsiniz ve myObject [i] yaparak değere erişebilirsiniz.


0

Bu çözümler de işe yarıyor.

// 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);
}

0

Bir Object.keys()öğeden özellik almak için işlevi kullanmak Object, ve özelliği ada göre aramanıza yardımcı olabilir, örneğin:

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'));

-1

Hızlı ve kirli:

function getObjName(obj) {
  return (wrap={obj}) && eval('for(p in obj){p}') && (wrap=null);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.