2015-09-25 66 views
0

我有對象的名稱循環遍歷多個對象的所有鍵一次?

['obj','obj2','objN'] 

這些對象是目標節點

{ 
    obj: { 
    key: value, 
    key2: value, 
    } 
    obj2:{ 
    key3: value 
    } 
... 
} 

我知道,我的一個目標,我可以做的數組:

for (var key in obj) { 
    if (obj.hasOwnProperty(key)) { 
    console.log(key) 
    } 
} 

但是否有可能循環遍歷多個對象的所有鍵而不做任何重複?

+0

循環數組,使用數組鍵和*初始對象*屬性名稱。 –

+0

如果您只關心按鍵,無論發生什麼值,都可以將這些對象合併在一起,然後遍歷該對象的按鍵。 –

+0

什麼是初始對象屬性名稱? – Himmators

回答

1

假設與形式的父容器對象:

var parentObj = 
{ 
    obj: { 
     key: value, 
     key2: value, 
    } 
    obj2: { 
     key3: value 
    } 
    ... 
} 

此外,如果我們要包括的每個子鍵只有一次, 我們

var objNameArray = ['obj','obj2','objN']; 
var allValues = []; 
var usedKeys = {}; 

for(var i = 0; i < objNameArray.length; ++i){ 
    // If the parent object does not have a matching sub-object, skip to the 
    // next iteration of the loop 
    if(!parentObj[objNameArray[i]]) { 
     continue; 
    } 
    var currentObj = parentObj[objNameArray[i]]; 
    var subKeys = Object.keys(currentObj); 
    for(var j = 0; j < subKeys.length; ++j) { 
     if(usedKeys[subKeys[j]]) { 
      continue; 
     } 
     usedKeys[subKeys[j]] = true; 
     allValues.push(currentObj[subKeys[j]]); 
    } 
} 

所有值從所有的按鍵在每個子對象中將會出現在數組allValues中,並且通過調用Object.keys(usedKeys);可以獲得每個子對象的所有鍵。請注意,如果子對象也可以有子對象,則需要調整此策略以支持遞歸。

0

如果正確地解釋問題,嘗試利用Object.keys()

var data = { 
 
    obj: { 
 
    key: 1, 
 
    key2: 2, 
 
    }, 
 
    obj2:{ 
 
    key3: 3 
 
    } 
 
}; 
 

 
for (var key in data) { 
 
    console.log(Object.keys(data[key])) 
 
}

+0

不會運行相同的密鑰多次,如果他們存在於obj和obj2? – Himmators

+0

@Himmators是否需要返回唯一鍵?或者,如果'obj2'具有'key2',那麼不會返回'key2'作爲結果的一部分? ,因爲之前在'obj'迭代的'key2'?預期的結果是什麼? – guest271314