gpt4 book ai didi

javascript - 对象的对象的问题

转载 作者:行者123 更新时间:2023-11-28 06:44:44 25 4
gpt4 key购买 nike

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

我希望这是有道理的,我想如果刚才有什么事情的话我只是让自己感到困惑,但我希望我清楚地说明了我已经尝试过的以及我希望发生的事情。

干杯,标清

最佳答案

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

关于javascript - 对象的对象的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33491586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com