Recorrer propiedades en objetos JavaScript con Lodash

123

¿Es posible recorrer las propiedades en un objeto JavaScript? Por ejemplo, tengo un objeto JavaScript definido como este:

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

Las propiedades se agregarán dinámicamente a este objeto. ¿Hay alguna manera de que pueda recorrer y verificar si existe una propiedad? ¿Si es así, cómo?

user3111277
fuente

Respuestas:

34

Sí, puede y no se necesita lodash ... es decir

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

Editar : la respuesta aceptada ( _.forOwn () ) debe ser https://stackoverflow.com/a/21311045/528262

stecb
fuente
6
+ Sé que quieren lodash funct-style, la mía era solo una forma de dejar que el OP entienda que puedes realizar un bucle de un obj sin depender de una biblioteca (en caso de que solo quiera esa funcionalidad sin incluir lodash)
stecb
39
En cuyo caso, hubiera sido bueno proporcionar ambas respuestas.
flq
1
usar lodashy no esto se justifica solo por no necesitar el hasOwnPropertycheque molesto
Mugen
601

Utilice _.forOwn().

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

https://lodash.com/docs#forOwn

Tenga en cuenta que las forOwnverificaciones hasOwnProperty, como suele ser necesario al recorrer las propiedades de un objeto. forInno hace esta comprobación.

djechlin
fuente
22
muy importante tener en cuenta que keyes el segundo parámetro, pero tiene sentido
Phil
18

Para su deseo declarado de "comprobar si existe una propiedad", puede utilizar directamente Lo-Dash has.

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

Definitivamente puedes hacer esto con Vanilla JS como ha demostrado stecb, pero creo que eaches la mejor respuesta a la pregunta central sobre cómo hacerlo con lodash.

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

Como mencionó JohnnyHK, también existe el hasmétodo que sería útil para el caso de uso, pero de lo que se dijo originalmente setpuede ser más útil. Digamos que desea agregar algo a este objeto dinámicamente como lo mencionó:

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

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

Así es como lo haría, según la descripción original.

Kevin Leary
fuente
2

Tomemos el siguiente objeto como ejemplo

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

Primero busque todas las claves en el obj

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

y luego recorrerlo

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

solo poniendo todo junto

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

En ES6, también es posible iterar sobre los valores de un objeto usando el for..ofbucle. Sin embargo, esto no funciona de inmediato para los objetos de JavaScript, ya que debe definir una propiedad @@ iterator en el objeto. Esto funciona como sigue:

  • El for..ofbucle pide al "objeto que se repita en iteración" (llamémoslo obj1 para un objeto iterador. El bucle itera sobre obj1 llamando sucesivamente al método next () en el objeto iterador proporcionado y utilizando el valor devuelto como valor para cada iteración del bucle.
  • El objeto iterador se obtiene invocando la función definida en la propiedad @@ iterator, o propiedad Symbol.iterator, de obj1. Esta es la función que debe definir usted mismo, y debería devolver un objeto iterador

Aquí hay un ejemplo:

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

Ahora podemos usar el for..ofciclo:

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

Sería útil comprender por qué necesita hacer esto con lodash. Si solo desea verificar si existe una clave en un objeto, no necesita lodash.

myObject.options.hasOwnProperty('property');

Si busca ver si existe un valor, puede usar _.invert

_.invert(myObject.options)[value]
Barry G
fuente