问题与对象的对象

时间:2015-11-03 04:52:18

标签: javascript

基本上我正在测试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 

如果我正在寻找特定的东西,比如Labrador有一个名为name的属性。

我希望这是有道理的,我想我现在只是困惑自己,但我希望我明确了我所尝试的以及我想要发生的事情。

干杯, SD

2 个答案:

答案 0 :(得分:0)

你循环只会返回父对象的属性 - animals。您需要以递归方式在每个子元素上调用它以获取所有警报。此外,您看到[Object object]的原因是因为您尝试将{}转换为字符串。在树中,键是唯一可以打印的部分,没有特殊的toString()。

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

        alert("Key: " + key);

        recursiveAlert(val);
    }
}

关于[Object 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};

并且您尝试访问其中不存在的属性,您将获得未定义的,虚假值。

tree.dog;
// => undefined

这意味着您可以使用if语句检查属性是否存在。但是,你只能走一层,即。

tree.dog.lab;
// => TypeError

但这没关系。

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

答案 1 :(得分:0)

你正在获得价值:[对象]“是正确的这就是for in在JavaScript中工作的方式 用于迭代对象或数组上的键值,例如,如果是结构 您的对象是这样的

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

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

输出

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

但在你的情况下

“animal”是嵌套对象的上键,它将对象保存在其中,这就是为什么你的循环只运行一次并返回对象

“动物”实际上具有以下价值

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

这是一个对象,这就是警告中显示[Object object]的原因。

你可以通过这种方式看到你内在物体的钥匙;

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"]