Прокрутка свойств в объекте 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, мой был просто способом дать OP понять, что вы можете зацикливать obj без lodash в зависимости от библиотеки (на случай, если он просто хочет эту функциональность без 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

Вы определенно можете сделать это с помощью vanilla 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 );

Вот как я бы это сделал, исходя из исходного описания.


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

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

myObject.options.hasOwnProperty('property');

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

_.invert(myObject.options)[value]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.