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?

pengguna3111277
sumber

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

stecb
sumber
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.

djechlin.dll
sumber
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);
JohnnyHK
sumber
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.

Kevin Leary
sumber
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*/})
Akki geek
sumber
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
evianpring.dll
sumber
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]
Barry G
sumber