Lodash ile JavaScript nesnesindeki özelliklerde döngü yapın


123

Bir JavaScript nesnesindeki özellikler arasında döngü yapmak mümkün müdür? Örneğin, şu şekilde tanımlanmış bir JavaScript nesnem var:

myObject.options = {
  property1: 'value 1',
  property2: 'value 2'
};

Özellikler bu nesneye dinamik olarak eklenecektir. Bir mülkün var olup olmadığını kontrol etmemin bir yolu var mı? Öyleyse nasıl?

Yanıtlar:


34

Evet yapabilirsin ve yapmana gerek yok ... yani

for (var key in myObject.options) {
  // check also if property is not inherited from prototype
  if (myObject.options.hasOwnProperty(key)) { 
    var value = myObject.options[key];
  }
}

Düzenleme : kabul edilen yanıt ( _.forOwn () ) https://stackoverflow.com/a/21311045/528262 olmalıdır


6
+ Lodash işlev stili istediklerini biliyorum, benimki sadece OP'nin bir kütüphaneye bağlı olarak bir nesneyi dışarı çevirebileceğini anlamasına izin vermenin bir yoluydu (sadece lodash dahil olmak üzere bu işlevselliği isterse)
stecb

39
Bu durumda, her iki cevabı da sağlamak güzel olurdu.
flq

1
bunu kullanmak lodashve kullanmamak sadece sinir bozucu hasOwnPropertykontrole ihtiyaç
Mugen

601

Kullanın _.forOwn().

_.forOwn(obj, function(value, key) { } );

https://lodash.com/docs#forOwn

Genellikle bir nesnenin özellikleri üzerinde döngü oluştururken yapmanız gereken forOwndenetimleri unutmayın hasOwnProperty. forInbu kontrolü yapmaz.


22
keybunun ikinci parametre olduğuna dikkat etmek çok önemli , ancak mantıklı
Phil

18

"Bir mülkün var olup olmadığını kontrol etme" isteğiniz için doğrudan Lo-Dash'ı kullanabilirsiniz has.

var exists = _.has(myObject, propertyNameToCheck);

3

Bunu stecb'in gösterdiği gibi vanilya JS ile kesinlikle yapabilirsiniz, ancak bence eachlodash ile nasıl yapılacağına dair temel soruya en iyi cevap bu.

_.each( myObject.options, ( val, key ) => { 
    console.log( key, val ); 
} );

JohnnyHK'nin bahsettiği gibi, haskullanım durumu için yararlı olacak bir yöntem de var , ancak başlangıçta belirtilenden setdaha yararlı olabilir. Diyelim ki, bahsettiğiniz gibi bu nesneye dinamik olarak bir şey eklemek istediğinizi varsayalım:

let dynamicKey = 'someCrazyProperty';
let dynamicValue = 'someCrazyValue';

_.set( myObject.options, dynamicKey, dynamicValue );

Orijinal açıklamaya göre bunu böyle yapardım.


2

Örnek olarak aşağıdaki nesneyi alalım

let obj = { property1: 'value 1', property2: 'value 2'};

Önce obj'deki tüm anahtarı getir

let keys = Object.keys(obj) //it will return array of keys

ve sonra içinden geç

keys.forEach(key => //your way)

sadece hepsini bir araya getirmek

Object.keys(obj).forEach(key=>{/*code here*/})

1

ES6'da, for..ofdöngüyü kullanarak bir nesnenin değerleri üzerinde yineleme yapmak da mümkündür . Ancak, nesnede bir @@ yineleyici özelliği tanımlamanız gerektiğinden, bu JavaScript nesneleri için kutudan çıktığı gibi çalışmaz. Bu şu şekilde çalışır:

  • for..ofDöngüsü (en bir yineleyici nesne için obj1 diyelim "nesne iterated edilmesi" sorar. Obj1 üzerinde döngü tekrara arda Resim yineleyici nesne üzerinde aşağıdaki () yöntemini ve her yineleme değeri olarak dönen değeri kullanılarak döngünün.
  • Yineleyici nesnesi, obj1'in @@ iterator özelliğinde veya Symbol.iterator özelliğinde tanımlanan işlevin çağrılmasıyla elde edilir. Bu, kendinizi tanımlamanız gereken işlevdir ve bir yineleyici nesnesi döndürmelidir

İşte bir örnek:

const obj1 = {
  a: 5,
  b: "hello",
  [Symbol.iterator]: function() {
    const thisObj = this;
    let index = 0;
    return {
      next() {
        let keys = Object.keys(thisObj);
        return {
          value: thisObj[keys[index++]],
          done: (index > keys.length)
        };
      }
    };
  }
};

Şimdi for..ofdöngüyü kullanabiliriz :

for (val of obj1) {
  console.log(val);
}    // 5 hello

0

Bunu neden lodash ile yapmanız gerektiğini anlamanız yardımcı olacaktır. Bir nesnede anahtar olup olmadığını kontrol etmek istiyorsanız, kirletmeye ihtiyacınız yoktur.

myObject.options.hasOwnProperty('property');

Bir değerin var olup olmadığını görmek istiyorsanız, kullanabilirsiniz _.invert

_.invert(myObject.options)[value]
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.