2017-09-14 27 views
0

我有一個對象具有多個對象,並且需要爲每個對象內的每個鍵創建一個循環。通過多維對象內部的鍵循環

我需要控制檯來記錄這樣的東西。

Iron 
TIBC 
carbon dioxide 
Sodium 
etc... 

這是我到目前爲止已經試過

(function() { 
 
    var blood = { 
 
    "blood": { 
 
     "one": { 
 
     "iron": "Iron", 
 
     "tibc": "TIBC", 
 

 
     }, 
 
     "two": { 
 
     "cd": "Carbon Dioxide", 
 
     "sodium": "Sodium", 
 
     "potassium": "Potassium", 
 
     "chloride": "Chloride", 
 
     }, 
 
     "three": { 
 
     "cholesterol": "Cholesterol", 
 
     "dhdl": "Direct HDL", 
 
     }, 
 
     "four": { 
 
     "rigg": "Rubella IgG", 
 
     "hbsag": "HBsAg", 
 
     "ahiv": "Anti-HIV 1+2", 
 
     "estrdiol": "Estradiol", 
 
     "fsh": "FSH", 
 
     } 
 
    } 
 
    } 
 

 
    for (var key in blood) { 
 
    if (blood.hasOwnProperty(key)) { 
 
     var newKey = blood[key] 
 

 
     for (var key in newKey) { 
 
     if (newKey.hasOwnProperty(key)) { 
 
      //do stuff 
 
      console.log(newKey[key]) 
 
     } 
 
     } 
 

 
    } 
 
    } 
 
})

+0

您的代碼再使用 「鑰匙」 外環內。如果你用'let'而不是'var'聲明變量,它會更好地工作(在新的JavaScript環境中)。 – Pointy

+0

你的內循環覆蓋變量'key'嘗試改變它到不同的名稱 – brenjt

+1

你也沒有執行你的IIFE(在最後放置'()'!) – Jamiec

回答

0

喜歡這個?

您正在使用for循環遍歷所有鍵,所以通過遞歸調用相同的循環並僅在對象的value是字符串時顯示輸出,我們才能得到所需的輸出,如果其類型爲object然後再次調用該函數。

var blood = { 
 
    "blood": { 
 
    "one": { 
 
     "iron": "Iron", 
 
     "tibc": "TIBC", 
 

 
    }, 
 
    "two": { 
 
     "cd": "Carbon Dioxide", 
 
     "sodium": "Sodium", 
 
     "potassium": "Potassium", 
 
     "chloride": "Chloride", 
 
    }, 
 
    "three": { 
 
     "cholesterol": "Cholesterol", 
 
     "dhdl": "Direct HDL", 
 
    }, 
 
    "four": { 
 
     "rigg": "Rubella IgG", 
 
     "hbsag": "HBsAg", 
 
     "ahiv": "Anti-HIV 1+2", 
 
     "estrdiol": "Estradiol", 
 
     "fsh": "FSH", 
 
    } 
 
    } 
 
} 
 

 
function keyGetter(data){ 
 
    for(key in data){ 
 
    if(typeof data[key] === typeof ""){ 
 
     console.log(data[key]); 
 
    }else{ 
 
     keyGetter(data[key]); 
 
    } 
 
    } 
 
} 
 
keyGetter(blood);

+0

請解釋什麼是問題以及如何解決問題。另外,點擊片段中的整潔按鈕。 – Barmar

+0

好吧,我看到我失蹤了。感謝您的幫助 – user2168066

+0

@ user2168066你能否再次檢查我的答案,我申請了遞歸併且只有鑰匙,這有點令人困惑,但編碼較少,使用起來更好! –

1

那是什麼Object.values是:

const result = Object.values(blood.blood).map(
    obj => Object.values(obj).join("\n") 
).join("\n"); 

console.log(result); 
0

你可以得到所有的值與下面的數組:

let allTypes = []; 

Object.values(blood.blood).forEach(v => { 
    // we are iterating over "one"..."four" 
    allTypes.push(...Object.values(v)); 
}); 

console.log(allTypes); 

將輸出["Iron", "TIBC", "Carbon Dioxide", "Sodium", "Potassium", "Chloride", "Cholesterol", "Direct HDL", "Rubella IgG", "HBsAg", "Anti-HIV 1+2", "Estradiol", "FSH"]

https://jsbin.com/kodolok/edit?js,console

Object.values遍歷是基本關聯數組對象時是非常有用的。

0

我做了一個遞歸函數,可以幫助你!

var blood = { 
 
     "blood": { 
 
      "one": { 
 
       "iron": "Iron", 
 
       "tibc": "TIBC", 
 

 
      }, 
 
      "two": { 
 
       "cd": "Carbon Dioxide", 
 
       "sodium": "Sodium", 
 
       "potassium": "Potassium", 
 
       "chloride": "Chloride", 
 
      }, 
 
      "three": { 
 
       "cholesterol": "Cholesterol", 
 
       "dhdl": "Direct HDL", 
 
      }, 
 
      "four": { 
 
       "rigg": "Rubella IgG", 
 
       "hbsag": "HBsAg", 
 
       "ahiv": "Anti-HIV 1+2", 
 
       "estrdiol": "Estradiol", 
 
       "fsh": "FSH", 
 
      } 
 
     } 
 
} 
 

 
loopThrough(blood) 
 

 
function loopThrough(obj){ 
 
    if(typeof obj == "object"){ 
 
    for(var i in obj){ 
 
     loopThrough(obj[i]); 
 
    } 
 
    }else{ 
 
    console.log(obj) 
 
    } 
 
    
 
}