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