2015-11-03 108 views
1

基本上我測試ES6,並希望嘗試和返回的對象數組中的對象的對象,數組中的每個對象有一個ID和父母,ID將是在父母的財產。夠簡單了,這裏是我的代碼:問題與對象的對象

//an array of objects 

let animals = [{ 
      id: "animal", 
      parent: null 
}, { 
      id: "dog", 
      parent: "animal" 
}, { 
      id: "cat", 
      parent: "animal" 
}, { 
      id: "fish", 
      parent: "animal" 
}, { 
      id: "labrador", 
      parent: "dog" 
}, { 
      id: "cocker spaniel", 
      parent: "dog" 
}, { 
      id: "bass", 
      parent: "fish" 
}, { 
      id: "tuna", 
      parent: "fish" 
}, { 
      id: "house cat", 
      parent: "cat" 
}, { 
      id: "outdoor cat", 
      parent: "cat" 
}, { 
      id: "human", 
      parent: "animal" 
}, { 
      id: "man", 
      parent: "human" 
}, { 
      id: "woman", 
      parent: "human" 
}]; 

//a recursive function to build our object of objects tree 

let makeTreeOfCategories = (categories, parent) => { 
      let parentNode = {}; 
      categories 
         .filter(category => category.parent === parent) 
         .forEach(category => parentNode[category.id] = 
            makeTreeOfCategories(categories, category.id)); 
      return parentNode; 
}; 

console.log(JSON.stringify(makeTreeOfTrees(animals, null), null, 2)); 

該代碼將返回:

{ 
    "animal": { 
     "dog": { 
      "labrador": {}, 
      "cocker spaniel": {} 
     }, 
     "cat": { 
      "house cat": {}, 
      "outdoor cat": {} 
     }, 
     "fish": { 
      "bass": {}, 
      "tuna": {} 
     }, 
     "human": { 
      "man": {}, 
      "woman": {} 
     } 
    } 
} 

現在,如果我們運行以下命令:

//call our object and store in a variable 

let obj = makeTreeOfCategories(animals, null); 

//loop through the object and alert each child item and its children 

for (var key in obj) { 
      var val = obj[key]; 
      alert("Key: " + key + " value:" + val); 
} 

它會提醒一次說「重點:動物價值:[對象對象]「,但我不明白的是爲什麼,我期望它會以」關鍵:動物價值:狗「,然後」關鍵:動物價值:貓「等等來回報。

你知道,基本上讓我遍歷對象的對象內的每個對象,並提醒其屬性和它們的值。

而且,如果你能告訴我這也是,我將如何訪問是這樣的:

{}.animal.dog.labrador 

如果我一直在尋找一些具體的事情一樣,如果拉布拉多有個名字叫例如財產。

我希望是有道理的,我想我只是混淆自己如果有什麼剛纔,但我希望我清楚我曾嘗試和我想的事情發生。

乾杯, SD

+0

可能重複( http://stackoverflow.com/q/5612787/1048572)或[爲什麼'[object object]'提到「對象」兩次?](http://stackoverflow.com/q/29847665/1048572) – Bergi

回答

0

你循環只會返回父對象的屬性 - 動物。您需要遞歸調用每個子元素來獲取所有警報。此外,您看到[Object object]的原因是因爲您正試圖將{}轉換爲字符串。在你的樹中,鍵是唯一可以打印的部分,沒有特別的toString()。

function recursiveAlert(node) { 
    for (var key in node) { 
     var val = node[key] 

     alert("Key: " + key); 

     recursiveAlert(val); 
    } 
} 

在您的[Object對象]的性質,如果你想要的是眼前的孩子,你可以編寫一個函數,讓他們爲你的字符串。

function getChildren(node) { 
    // get all properties as an array, then convert to a string 
    return Object.keys(node).toString(); 
} 

function recursiveAlert(node) { 
    for (var key in node) { 
     var val = node[key] 

     alert("Key: " + key + ", Val: " + getChildren(val)); 

     recursiveAlert(val); 
    } 
} 

最後,如何檢查特定屬性是否存在。如果你有一個對象

var tree = {id: 2}; 

和您嘗試訪問它的屬性不存在,你會得到不確定的,一個falsy值。

tree.dog; 
// => undefined 

這意味着您可以使用if語句檢查屬性是否存在。但是,你只能走一層,也就是說。

tree.dog.lab; 
// => TypeError 

但是,這沒關係。

if (tree.dog) { 
    if (tree.dog.lab) { 
    // do something 
    } 
} 
0

你得到的值:[Object對象]」是正確的,這是如何在JavaScript
for in工作的對象或例如一個陣列上迭代鍵值,如果你的對象的結構 是一樣的東西這

var obj = {"animal":"dog","Bird":"peacock"} 

for (var key in obj) { 
     alert("Key: " + key + " value:" + val); 
}  

輸出

Key: animal value:dog 
Key: Bird value:peacock 

但在你的情況下

「動物」是指保持在它裏面的對象嵌套對象的上級密鑰,這就是爲什麼只爲一個時間和返回的循環運行對象

「動物」實際持有下列值

"dog": { 
      "labrador": {}, 
      "cocker spaniel": {} 
     }, 
     "cat": { 
      "house cat": {}, 
      "outdoor cat": {} 
     }, 
     "fish": { 
      "bass": {}, 
      "tuna": {} 
     }, 
     "human": { 
      "man": {}, 
      "woman": {} 
     } 

這是一個對象,這就是爲什麼[Object object]顯示在alert中。

你可以通過這種方式看到你的內部對象的鍵;

for (var key in obj) { 
      var val = obj[key]; 
      alert("Key: " + key + " value:" + Object.keys(val)); 
} 

輸出:

Key: animal value:dog,cat,fish,human 

關於第二個問題 如何通過使用獲得對象的屬性值 「」 使用

console.log(obj.animal.dog.labrador) 

它表明Object {}

,如果你想讀的密鑰使用

console.log(Object.keys(obj.animal.dog))它會顯示[轉換對象爲字符串]的

["labrador", "cocker spaniel"]