2015-11-03 65 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"]