Перегляньте властивості в об’єкті JavaScript за допомогою Lodash


123

Чи можливо прокрутити властивості в об’єкті JavaScript? Наприклад, у мене об’єкт JavaScript визначений так:

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

Властивості будуть динамічно додані до цього об’єкта. Чи є спосіб, щоб я просто пройшов цикл і здійснив перевірку, чи існує властивість? Якщо так, то як?

Відповіді:


34

Так можна і лодаш не потрібен ... тобто

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

Редагувати : прийнята відповідь ( _.forOwn () ) має бути https://stackoverflow.com/a/21311045/528262


6
+ Я знаю, що вони хочуть стилю функцій lodash, мій був лише способом дати зрозуміти, що ОП може зафіксувати об'єкт без виходу залежно від бібліотеки (на випадок, якщо він просто хоче, щоб ця функціональність не включала лодаш)
stecb

39
У цьому випадку було б добре відповісти на обидва відповіді.
flq

1
використання lodashта не це виправдано лише тим, що не потрібно докучливої hasOwnPropertyперевірки
Mugen

601

Використовуйте _.forOwn().

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

https://lodash.com/docs#forOwn

Зауважте, що forOwnперевірки hasOwnProperty, як це зазвичай потрібно робити під час циклу за властивостями об'єкта. forInне робить цю перевірку.


22
Дуже важливо зазначити, що keyце другий парам, але це має сенс
Філ

18

За заявленим бажанням "перевірити, чи існує властивість", ви можете безпосередньо скористатися Lo-Dash has.

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

3

Ви точно можете зробити це з ванільним JS, як показав stecb, але я вважаю, що eachце найкраща відповідь на основне питання щодо того, як це зробити з лодашем.

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

Як згадував JohnnyHK, існує також hasметод, який був би корисним у випадку використання, але з того, що спочатку зазначено, setможе бути корисніше. Скажімо, ви хотіли щось додати до цього об’єкта динамічно, як ви вже згадували:

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

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

Ось як я це зробив, грунтуючись на оригінальному описі.


2

Давайте візьмемо нижче приклад як об'єкт

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

Спочатку заберіть весь ключ у obj

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

а потім пропустіть через нього

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

просто склавши всі разом

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

1

У ES6 також можливо повторити значення об'єкта за допомогою for..ofциклу. Однак це не спрацьовує прямо з поля для об’єктів JavaScript, оскільки ви повинні визначити властивість @@ iterator на об'єкті. Це працює так:

  • for..ofЦикл запитує «об'єкт, що підлягають итерациям» (назву його obj1 для об'єкта ітератора. Ітерації циклу по obj1 шляху послідовного виклику методу наступний () на зазначеному об'єкті ітератора і використовуючи значення, що повертається в якості значення для кожної ітерації петлі.
  • Об'єкт ітератора отримується за допомогою виклику функції, визначеної у властивості @@ iterator або властивості Symbol.iterator, від obj1. Це функція, яку ви повинні визначити самостійно, і вона повинна повертати об'єкт ітератора

Ось приклад:

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

Тепер ми можемо використовувати for..ofцикл:

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

0

Було б корисно зрозуміти, для чого потрібно робити це з лодашем. Якщо ви просто хочете перевірити, чи існує ключ в об'єкті, вам не знадобиться лодаш.

myObject.options.hasOwnProperty('property');

Якщо ви шукаєте, щоб перевірити, чи існує значення, ви можете скористатися _.invert

_.invert(myObject.options)[value]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.