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?

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


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.


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

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.


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*/})

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

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]
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.