Прокрутка свойств объекта JavaScript с помощью Lodash
Можно ли прокручивать свойства объекта JavaScript? Например, у меня есть объект JavaScript, который определяется следующим образом:
myObject.options = {
property1: 'value 1',
property2: 'value 2'
};
Свойства будут динамически добавляться к этому объекту. Есть ли способ для меня просто пройти и проверить, существует ли свойство? Если да, то как?
Ответы
Ответ 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 );
Вот как я это сделаю, основываясь на оригинальном описании.