Подтвердить что ты не робот

Прокрутка свойств объекта JavaScript с помощью Lodash

Можно ли прокручивать свойства объекта JavaScript? Например, у меня есть объект JavaScript, который определяется следующим образом:

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

Свойства будут динамически добавляться к этому объекту. Есть ли способ для меня просто пройти и проверить, существует ли свойство? Если да, то как?

4b9b3361

Ответ 1

Да можно и лодаш не нужен... т.е.

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()) должен быть fooobar.com/questions/79693/...

Ответ 2

Используйте _.forOwn().

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

https://lodash.com/docs#forOwn

Обратите внимание, что forOwn проверяет hasOwnProperty, как вам обычно нужно делать при переходе по свойствам объекта. forIn не выполняет эту проверку.

Ответ 3

Для вашего заявленного желания "проверить, существует ли свойство" вы можете напрямую использовать Lo-Dash has.

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

Ответ 4

Возьмем ниже объект в качестве примера

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

Ответ 5

В ES6 также можно выполнять итерацию по значениям объекта с использованием цикла for..of. Однако это не работает прямо из окна для объектов JavaScript, так как вы должны определить свойство @@iterator на объекте. Это работает следующим образом:

  • В цикле for..of запрашивается "итерация объекта" (пусть он вызывает объект obj1 для объекта итератора. Цикл выполняет итерацию по obj1, последовательно вызывая метод next() на предоставленном объекте итератора и используя возвращаемое значение как значение для каждой итерации цикла.
  • Объект итератора получается путем вызова функции, определенной в свойстве @it 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

Ответ 6

Было бы полезно понять, почему вам нужно делать это с помощью lodash. Если вы просто хотите проверить, существует ли ключ в объекте, вам не нужен lodash.

myObject.options.hasOwnProperty('property');

Если вы хотите посмотреть, существует ли значение, вы можете использовать _.invert

_.invert(myObject.options)[value]

Ответ 7

Вы можете определенно сделать это с ванильным JS, как показал stecb, но я думаю, что each - лучший ответ на основной вопрос о том, как это сделать с помощью lodash.

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

Как упомянуто JohnnyHK, есть также метод has который будет полезен для варианта использования, но из того, что было заявлено изначально, set может быть более полезным. Допустим, вы хотите добавить что-то к этому объекту динамически, как вы упомянули:

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

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

Вот как я это сделаю, основываясь на оригинальном описании.