【问题标题】:issue with an object of objects对象对象的问题
【发布时间】:2015-11-03 04:52:17
【问题描述】:

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

如果我正在寻找特定的东西,例如拉布拉多有一个名为 name 的属性。

我希望这是有道理的,我想我只是在混淆自己,如果有的话,但我希望我能清楚地说明我已经尝试过什么以及我希望发生什么。

干杯, 标清

【问题讨论】:

标签: javascript


【解决方案1】:

您的循环只会返回父对象 - 动物的属性。您需要在每个子元素上递归调用它以获取所有警报。此外,您看到 [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};

如果您尝试访问其上不存在的属性,您将得到未定义的虚假值。

tree.dog;
// => undefined

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

tree.dog.lab;
// => TypeError

但这没关系。

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

【讨论】:

    【解决方案2】:

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

    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”是嵌套对象的上键,其中包含对象,这就是为什么您的循环只运行一次并返回对象的原因

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

    【讨论】:

      猜你喜欢
      • 2014-05-27
      • 1970-01-01
      • 2017-12-29
      • 1970-01-01
      • 1970-01-01
      • 2014-07-02
      • 2010-12-06
      • 2017-11-28
      • 2020-10-20
      相关资源
      最近更新 更多