Javascript 与一个或多个对象有关的问题

Javascript 与一个或多个对象有关的问题,javascript,Javascript,基本上,我正在测试ES6,希望尝试从一个对象数组返回一个对象对象,数组中的每个对象都有一个id和一个父对象,id将是父对象中的属性名称。很简单,下面是我的代码: //an array of objects let animals = [{ id: "animal", parent: null }, { id: "dog", parent: "animal" }, { id:

基本上,我正在测试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);
}
有一次,它警告说“Key:animal value:[Object Object]”,但我不明白的是,为什么我希望它返回“Key:animal value:dog”,然后返回“Key:animal value:cat”等等

你知道,基本上允许我循环遍历对象对象中的每个对象,并提醒其属性及其值

另外,如果您也能告诉我,我将如何访问以下内容:

{}.animal.dog.labrador 
如果我在寻找一些特定的东西,比如拉布拉多有一个叫做name的属性

我希望这是有道理的,我想我只是把自己弄糊涂了,如果刚才有什么事情发生的话,但我希望我清楚地表明我已经尝试了什么,我希望发生什么

干杯,
SD

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

根据[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
  }
}

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

根据[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
  }
}

您得到的值:[Object]“是正确的这就是
for in
在JavaScript中的工作方式
例如,在对象或数组上迭代键值,例如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”是嵌套对象的上键,它将对象保存在嵌套对象中,这就是循环只运行一次并返回对象的原因

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

 "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(Object.keys(obj.animal.dog))
它将显示

["labrador", "cocker spaniel"]

您得到的值:[Object]“是正确的这就是
for in
在JavaScript中的工作方式
例如,在对象或数组上迭代键值,例如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”是嵌套对象的上键,它将对象保存在嵌套对象中,这就是循环只运行一次并返回对象的原因

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

 "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(Object.keys(obj.animal.dog))
它将显示

["labrador", "cocker spaniel"]
或的可能副本或可能副本