2014-01-23 47 views
75

是否可以遍歷JavaScript對象中的屬性?舉例來說,我已經定義爲這樣的JavaScript對象:使用Lodash循環瀏覽JavaScript對象中的屬性

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

屬性將得到動態添加到該對象。有沒有辦法讓我循環通過並檢查一個屬性是否存在?如果是這樣,怎麼樣?

回答

22

當然可以,並不需要lodash ......即

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

編輯:接受的答案(_.forOwn())應https://stackoverflow.com/a/21311045/528262

+4

+我知道他們想要lodash funct-style,我只是讓OP明白你可以根據庫來循環obj w/out(如果他只是想要包含lodash的功能) – stecb

+29

在這種情況下,提供兩種答案本來就不錯。 – flq

+0

而且速度也更快。但更冗長,可讀性更差。 –

461

使用_.forOwn()

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

https://lodash.com/docs#forOwn

注意forOwn檢查hasOwnProperty,因爲你通常需要做遍歷一個對象的屬性時。 forIn不執行此檢查。

+40

這應該是正確的答案 – csotiriou

+12

非常重要需要注意的是'key'是第二PARAM,但它是有道理的 – Phil

+0

http://stackoverflow.com/a/32104942/170881 –

11

對於您所說的「檢查房產是否存在」的願望,您可以直接使用Lo-Dash的has

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

這是OP實際描述的需求的最佳答案。問題標題是誤導性的。 –

0

這將有助於理解你爲什麼需要用lodash做到這一點。如果你只是想檢查一個對象中是否存在一個鍵,你不需要lodash。

myObject.options.hasOwnProperty('property'); 

如果你想看看是否存在一個值,你可以使用_.invert

_.invert(myObject.options)[value] 
0

在ES6,還可以遍歷使用for..of循環對象的值。然而,這對於JavaScript對象而言並不適用,因爲您必須在對象上定義@@ iterator屬性。這種工作方式如下:

  • for..of循環詢問「要遍歷對象」(姑且稱之爲OBJ1一個迭代器對象在OBJ1循環迭代通過連續調用next()方法所提供的迭代器。對象並使用返回值作爲循環的每次迭代的值
  • 通過調用obj1的@@ iterator屬性或Symbol.iterator屬性中定義的函數來獲取迭代器對象。這是函數,你必須自己定義,它應該返回一個迭代對象

下面是一個例子:

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

現在我們可以使用for..of循環:

for (val of obj1) { 
    console.log(val); 
} // 5 hello 
相關問題