Repetir propriedades no objeto JavaScript com o Lodash


123

É possível percorrer as propriedades em um objeto JavaScript? Por exemplo, eu tenho um objeto JavaScript definido como este:

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

As propriedades serão adicionadas dinamicamente a esse objeto. Existe uma maneira de fazer um loop e verificar se existe uma propriedade? Se sim, como?

Respostas:


34

Sim, você pode e o lodash não é necessário ...

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 : a resposta aceita ( _.forOwn () ) deve ser https://stackoverflow.com/a/21311045/528262


6
+ Eu sei que eles querem o estilo funct do lodash, o meu era apenas uma maneira de permitir que o OP entendesse que você pode executar um loop sem obj, dependendo de uma biblioteca (no caso de ele querer essa funcionalidade sem o lodash)
stecb

39
Nesse caso, fornecer as duas respostas teria sido bom.
Flq 31/07

1
usando lodashe não é justificada apenas por não precisar o irritante hasOwnPropertycheque
Mugen

600

Use _.forOwn().

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

https://lodash.com/docs#forOwn

Observe que as forOwnverificações hasOwnProperty, como você normalmente precisa ao fazer um loop sobre as propriedades de um objeto. forInnão faz essa verificação.


22
muito importante notar que keyé a segunda param, mas faz sentido
Phil

18

Para o seu desejo declarado de "verificar se existe uma propriedade", você pode usar diretamente o Lo-Dash's has.

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

3

Definitivamente, você pode fazer isso com o JS de baunilha, como o stecb mostrou, mas acho que eaché a melhor resposta para a pergunta principal sobre como fazê-lo com o lodash.

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

Como o JohnnyHK mencionou, também existe o hasmétodo que seria útil para o caso de uso, mas do que foi originalmente declarado setpode ser mais útil. Digamos que você queira adicionar algo a esse objeto dinamicamente, como você mencionou:

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

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

É assim que eu faria, com base na descrição original.


2

Vamos pegar o objeto abaixo como exemplo

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

Primeiro, busque toda a chave no objeto

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

e depois percorrer

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

apenas colocando tudo junto

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

1

No ES6, também é possível iterar sobre os valores de um objeto usando o for..ofloop. Entretanto, isso não funciona imediatamente para objetos JavaScript, pois você deve definir uma propriedade @@ iterator no objeto. Isso funciona da seguinte maneira:

  • O for..ofloop solicita que o "objeto seja iterado" (vamos chamá-lo de obj1 para um objeto iterador. O loop itera sobre obj1 chamando sucessivamente o método next () no objeto iterador fornecido e usando o valor retornado como o valor para cada iteração do laço.
  • O objeto iterador é obtido invocando a função definida na propriedade @@ iterator, ou Symbol.iterator, de obj1. Esta é a função que você deve definir a si mesmo e deve retornar um objeto iterador

Aqui está um exemplo:

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

Agora podemos usar o for..ofloop:

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

0

Seria útil entender por que você precisa fazer isso com o lodash. Se você deseja apenas verificar se existe uma chave em um objeto, não precisa do lodash.

myObject.options.hasOwnProperty('property');

Se você procura ver se existe um valor, pode usar _.invert

_.invert(myObject.options)[value]
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.