Przejrzyj właściwości w obiekcie JavaScript za pomocą Lodash

123

Czy można przeglądać właściwości obiektu JavaScript? Na przykład mam obiekt JavaScript zdefiniowany w ten sposób:

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

Właściwości zostaną dynamicznie dodane do tego obiektu. Czy istnieje sposób, bym po prostu przeszukał i sprawdził, czy właściwość istnieje? Jeśli tak to jak?

user3111277
źródło

Odpowiedzi:

34

Tak, możesz i lodash nie jest potrzebny ... tj

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

Edytuj : zaakceptowaną odpowiedzią ( _.forOwn () ) powinna być https://stackoverflow.com/a/21311045/528262

stecb
źródło
6
+ Wiem, że chcą funkcjonować w stylu lodash, mój był tylko sposobem na to, aby OP zrozumiał, że możesz zapętlić obiekt bez użycia biblioteki (na wypadek, gdyby chciał tylko tej funkcji bez lodash)
stecb
39
W takim przypadku udzielenie obu odpowiedzi byłoby miłe.
flq
1
używanie, lodasha nie to, jest uzasadnione tylko tym, że nie potrzebuje irytującego hasOwnPropertyczeku
Mugen
601

Użyj _.forOwn().

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

https://lodash.com/docs#forOwn

Zwróć uwagę, że forOwnsprawdza hasOwnProperty, tak jak zwykle trzeba to zrobić, gdy przeglądasz właściwości obiektu. forInnie wykonuje tej kontroli.

djechlin
źródło
22
bardzo ważne, aby pamiętać, że keyjest to drugi parametr, ale ma to sens
Phil
18

Jeśli chcesz „sprawdzić, czy nieruchomość istnieje”, możesz bezpośrednio skorzystać z Lo-Dash has.

var exists = _.has(myObject, propertyNameToCheck);
JohnnyHK
źródło
3

Zdecydowanie możesz to zrobić za pomocą waniliowego JS, jak pokazał stecb, ale myślę, że eachjest to najlepsza odpowiedź na podstawowe pytanie dotyczące tego, jak to zrobić z lodash.

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

Jak wspomniał JohnnyHK, istnieje również hasmetoda, która byłaby pomocna w przypadku użycia, ale z tego, co zostało pierwotnie stwierdzone, setmoże być bardziej przydatna. Powiedzmy, że chcesz dodać coś do tego obiektu dynamicznie, jak wspomniałeś:

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

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

Tak bym to zrobił, na podstawie oryginalnego opisu.

Kevin Leary
źródło
2

Weźmy poniższy obiekt jako przykład

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

Najpierw pobierz cały klucz z obj

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

a następnie przejrzyj ją

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

po prostu składając wszystko razem

Object.keys(obj).forEach(key=>{/*code here*/})
Akki maniakiem
źródło
1

W ES6 można również iterować po wartościach obiektu za pomocą for..ofpętli. Nie działa to jednak od razu w przypadku obiektów JavaScript, ponieważ musisz zdefiniować właściwość @@ iterator w obiekcie. Działa to w następujący sposób:

  • for..ofPętli prosi „obiekt należy powtórzyć nad” (powiedzmy nazwać obj1 dla obiektu iteracyjnej. Na iteracje pętli ponad obj1 kolejno przez wywołanie następnego sposobu () w przewidzianym obiektu iteracyjnej i używania zwrócona wartość jako wartość dla każdej iteracji pętli.
  • Obiekt iterator jest uzyskiwany przez wywołanie funkcji zdefiniowanej we właściwości @@ iterator lub właściwości Symbol.iterator obiektu obj1. Jest to funkcja, którą musisz sam zdefiniować, i powinna ona zwrócić obiekt iteratora

Oto przykład:

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

Teraz możemy użyć for..ofpętli:

for (val of obj1) {
  console.log(val);
}    // 5 hello
evianpring
źródło
0

Byłoby pomocne, aby zrozumieć, dlaczego musisz to zrobić z lodash. Jeśli chcesz tylko sprawdzić, czy w obiekcie istnieje klucz, nie potrzebujesz lodash.

myObject.options.hasOwnProperty('property');

Jeśli chcesz sprawdzić, czy istnieje wartość, możesz użyć _.invert

_.invert(myObject.options)[value]
Barry G.
źródło