Цикл через свойства в объекте JavaScript с помощью Lodash
можно ли перебирать свойства в объекте JavaScript? Например, у меня есть объект JavaScript, определенный следующим образом:
myObject.options = {
property1: 'value 1',
property2: 'value 2'
};
свойства будут динамически добавлены к этому объекту. Есть ли способ для меня, чтобы просто перебрать и проверить, если свойство существует? Если да, то как?
5 ответов:
да можно и лодаш не нужен... то есть
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: принято отвечать (_.forOwn ()) должно быть https://stackoverflow.com/a/21311045/528262
использовать
_.forOwn()
._.forOwn(obj, function(value, key) { } );
https://lodash.com/docs#forOwn
отметим, что
forOwn
проверкиhasOwnProperty
, как это обычно требуется при циклическом переборе свойств объекта.forIn
не делает эту проверку.
для вашего заявленного желания "проверить, существует ли свойство" вы можете напрямую использовать lo-Dash's
has
.var exists = _.has(myObject, propertyNameToCheck);
в ES6 также можно перебирать значения объекта с помощью
for..of
петли. Однако это не работает прямо из коробки для объектов JavaScript, поскольку вы должны определить свойство @@iterator для объекта. Это работает следующим образом:
- The
for..of
цикл запрашивает "объект для итерации" (назовем его obj1 для объекта итератора. Цикл выполняет итерацию над obj1 путем последовательного вызова метода next() на предоставленном объекте итератора и использования возвращаемое значение как значение для каждой итерации цикла.- объект итератора получается путем вызова функции, определенной в свойстве @@iterator или символе.свойство итератора, of 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
было бы полезно понять, почему вам нужно сделать это с lodash. Если вы просто хотите проверить, существует ли ключ в объекте, вам не нужен lodash.
myObject.options.hasOwnProperty('property');
Если вы ищете, чтобы увидеть, если значение Существует, вы можете использовать
_.invert
_.invert(myObject.options)[value]