Ulangi properti di objek JavaScript dengan Lodash


123

Apakah mungkin untuk mengulang properti dalam objek JavaScript? Misalnya, saya memiliki objek JavaScript yang didefinisikan sebagai ini:

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

Properti akan ditambahkan secara dinamis ke objek ini. Apakah ada cara bagi saya untuk mengulang dan memeriksa apakah ada properti? Jika ya, bagaimana caranya?

Jawaban:


34

Ya, Anda bisa dan lodash tidak diperlukan ... yaitu

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

Edit : jawaban yang diterima ( _.forOwn () ) harus https://stackoverflow.com/a/21311045/528262


6
+ Saya tahu mereka ingin lodash funct-style, milik saya hanyalah cara untuk membiarkan OP memahami Anda dapat memutar objek tanpa bergantung pada perpustakaan (jika dia hanya menginginkan fungsionalitas itu tanpa termasuk lodash)
stecb

39
Dalam hal ini, memberikan kedua jawaban itu akan menyenangkan.
flq

1
menggunakan lodashdan tidak ini dibenarkan hanya dengan tidak memerlukan hasOwnPropertypemeriksaan yang mengganggu
Mugen

601

Gunakan _.forOwn().

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

https://lodash.com/docs#forOwn

Perhatikan bahwa forOwnpemeriksaan hasOwnProperty, seperti yang biasanya perlu Anda lakukan saat melakukan perulangan pada properti objek. forIntidak melakukan pemeriksaan ini.


22
sangat penting untuk dicatat bahwa keyini adalah parameter kedua, tetapi masuk akal
Phil

18

Untuk keinginan Anda untuk "memeriksa apakah ada properti", Anda dapat langsung menggunakan Lo-Dash has.

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

3

Anda pasti bisa melakukan ini dengan vanilla JS seperti yang ditunjukkan STECB, tapi menurut saya eachini adalah jawaban terbaik untuk pertanyaan inti tentang bagaimana melakukannya dengan lodash.

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

Seperti yang disebutkan JohnnyHK, ada juga hasmetode yang akan membantu kasus penggunaan, tetapi dari apa yang dinyatakan semula setmungkin lebih berguna. Katakanlah Anda ingin menambahkan sesuatu ke objek ini secara dinamis seperti yang Anda sebutkan:

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

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

Begitulah cara saya melakukannya, berdasarkan deskripsi asli.


2

Mari kita ambil objek di bawah ini sebagai contoh

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

Pertama, ambil semua kunci di obj

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

dan kemudian mengulanginya

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

hanya menyatukan semuanya

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

1

Di ES6, dimungkinkan juga untuk mengulangi nilai suatu objek menggunakan for..of loop. Namun, ini tidak langsung berfungsi untuk objek JavaScript, karena Anda harus mendefinisikan properti @@ iterator pada objek tersebut. Ini bekerja sebagai berikut:

  • Itu for..of Loop meminta "objek yang akan iterasi berakhir" (sebut saja obj1 untuk objek iterator. Loop iterates atas obj1 oleh berturut-turut memanggil metode berikutnya () pada objek iterator yang disediakan dan menggunakan nilai yang dikembalikan sebagai nilai untuk setiap iterasi dari lingkaran.
  • Objek iterator diperoleh dengan menjalankan fungsi yang didefinisikan dalam properti @@ iterator, atau properti Symbol.iterator, dari obj1. Ini adalah fungsi yang harus Anda definisikan sendiri, dan harus mengembalikan objek iterator

Berikut ini contohnya:

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

Sekarang kita bisa menggunakan for..ofloop:

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

0

Akan sangat membantu untuk memahami mengapa Anda perlu melakukan ini dengan lodash. Jika Anda hanya ingin memeriksa apakah ada kunci di suatu objek, Anda tidak perlu lodash.

myObject.options.hasOwnProperty('property');

Jika Anda ingin melihat apakah ada nilai, Anda dapat menggunakan _.invert

_.invert(myObject.options)[value]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.