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?

user3111277
fonte

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

stecb
fonte
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.

djechlin
fonte
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);
JohnnyHK
fonte
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.

Kevin Leary
fonte
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*/})
Akki geek
fonte
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
evianpring
fonte
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]
Barry G
fonte