Vòng lặp qua các thuộc tính trong đối tượng JavaScript với Lodash


123

Có thể lặp qua các thuộc tính trong một đối tượng JavaScript không? Ví dụ: tôi có một đối tượng JavaScript được định nghĩa như sau:

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

Các thuộc tính sẽ được thêm động vào đối tượng này. Có cách nào để tôi chỉ cần lặp lại và kiểm tra xem thuộc tính có tồn tại không? Nếu vậy, làm thế nào?

Câu trả lời:


34

Có, bạn có thể và không cần lodash ... tức là

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

Chỉnh sửa : câu trả lời được chấp nhận ( _.forOwn () ) phải là https://stackoverflow.com/a/21311045/528262


6
+ Tôi biết họ muốn lodash funct-style, tôi chỉ là một cách để OP hiểu rằng bạn có thể lặp lại một obj w / out tùy thuộc vào thư viện (trong trường hợp anh ấy chỉ muốn chức năng đó có w / o bao gồm lodash)
stecb

39
Trong trường hợp đó, cung cấp cả hai câu trả lời sẽ rất tốt.
flq,

1
sử dụng lodashvà không này là hợp lý chỉ bằng cách không cần sự gây phiền nhiễu hasOwnPropertyséc
Mugen

601

Sử dụng _.forOwn().

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

https://lodash.com/docs#forOwn

Lưu ý rằng forOwnkiểm tra hasOwnProperty, như bạn thường cần làm khi lặp qua các thuộc tính của đối tượng. forInkhông thực hiện kiểm tra này.


22
rất quan trọng cần lưu ý rằng đó keylà thông số thứ hai, nhưng nó có ý nghĩa
Phil

18

Đối với mong muốn đã nêu của bạn là "kiểm tra xem một thuộc tính có tồn tại hay không", bạn có thể trực tiếp sử dụng Lo-Dash has.

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

3

Bạn chắc chắn có thể làm điều này với vanilla JS như stecb đã chỉ ra, nhưng tôi nghĩ đây eachlà câu trả lời tốt nhất cho câu hỏi cốt lõi liên quan đến cách thực hiện với lodash.

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

Giống như JohnnyHK đã đề cập, cũng có hasphương pháp sẽ hữu ích cho trường hợp sử dụng, nhưng từ những gì được nêu ban đầu setcó thể hữu ích hơn. Giả sử bạn muốn thêm động một thứ gì đó vào đối tượng này như bạn đã đề cập:

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

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

Đó là cách tôi sẽ làm, dựa trên mô tả ban đầu.


2

Hãy lấy đối tượng dưới đây làm ví dụ

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

Đầu tiên tìm nạp tất cả khóa trong obj

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

và sau đó lặp lại nó

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

chỉ đặt tất cả lại với nhau

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

1

Trong ES6, cũng có thể lặp lại các giá trị của một đối tượng bằng for..ofvòng lặp. Tuy nhiên, điều này không hoạt động ngay đối với các đối tượng JavaScript, vì bạn phải xác định thuộc tính trình vòng lặp @@ trên đối tượng. Điều này hoạt động như sau:

  • Các for..ofvòng lặp hỏi "đối tượng được lặp qua" (chúng ta hãy gọi nó obj1 cho một đối tượng iterator. Các lặp loop trên obj1 bởi liên tiếp gọi phương thức tiếp theo () trên đối tượng iterator được cung cấp và sử dụng giá trị trả về là giá trị cho mỗi lần lặp của vòng lặp.
  • Đối tượng trình vòng lặp có được bằng cách gọi hàm được xác định trong thuộc tính trình vòng lặp @@ hoặc thuộc tính Symbol.iterator của obj1. Đây là hàm bạn phải tự định nghĩa và nó sẽ trả về một đối tượng trình lặp

Đây là một ví dụ:

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

Bây giờ chúng ta có thể sử dụng for..ofvòng lặp:

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

0

Sẽ rất hữu ích nếu bạn hiểu tại sao bạn cần làm điều này với lodash. Nếu bạn chỉ muốn kiểm tra xem khóa có tồn tại trong một đối tượng hay không, bạn không cần lodash.

myObject.options.hasOwnProperty('property');

Nếu bạn muốn xem một giá trị có tồn tại hay không, bạn có thể sử dụng _.invert

_.invert(myObject.options)[value]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.