理解对象的问题(获取母子节点之间的年龄差)
Trouble with understanding objects ( Getting the age difference between mother and child nodes)
我目前正在复习书中的一堆旧练习,在理解对象的关键概念时遇到了一些困难,所以这是我的问题。考虑以下JSON代码
var ANCESTRY_FILE = "['n " + [
'{"name": "Carolus Haverbeke", "sex": "m", "born": 1832, "died": 1905, "father": "Carel Haverbeke", "mother": "Maria van Brussel"}',
'{"name": "Emma de Milliano", "sex": "f", "born": 1876, "died": 1956, "father": "Petrus de Milliano", "mother": "Sophia van Damme"}',
'{"name": "Maria de Rycke", "sex": "f", "born": 1683, "died": 1724, "father": "Frederik de Rycke", "mother": "Laurentia van Vlaenderen"}'
问题陈述基本上是为了得到母亲和孩子之间差异的平均值。以下是的答案
var ancestry = JSON.parse(ANCESTRY_FILE);
function average(array) {
function plus(a, b) { return a + b; }
return array.reduce(plus) / array.length;
}
var byName = {};
ancestry.forEach(function(person) {
byName[person.name] = person;
});
var differences = ancestry.filter(function(person) {
return byName[person.mother] != null;
}).map(function(person) {
return person.born - byName[person.mother].born;
});
console.log(average(differences));
我想我理解代码,但我有点困惑,为什么有些事情会这样发生。首先,byName[person.name] = person;
使byName
对象具有name
的密钥,并将其设置为原始对象。所以基本上人们可以把它看作是一次迭代
Carolus Haverbeke: '{"name": "Carolus Haverbeke", "sex": "m", "born": 1832, "died": 1905, "father": "Carel Haverbeke", "mother": "Maria van Brussel"}'
现在我的困惑是,如果我尝试console.log(obj[person.mother])
,为什么会得到一堆未定义的值,但有时会得到一个对象?难道一切都不应该是undefined
吗?我们从未将obj[person.mother]
设置为任何值。
第二,为什么不能用person.mother !=null
代替byName[person.mother] != null;
?我们不想基于nulls
进行筛选吗?我不知道这两张支票有什么区别。
谢谢!
我已经设置了一个工作示例,因为您的示例抛出了很多错误,请检查以下片段:https://repl.it/Cidr
现在,回答您的问题:
如果我尝试console.log(obj[person.moth]),为什么会得到一堆未定义的值,但有时会得到一个对象?难道所有的东西都不应该被定义吗?我们从不把obj[人.母亲]设定为任何事情。
我猜obj实际上是指byName(一本字典)。有了这个假设,您就可以将所有数据存储在这个字典中。有时你会得到未定义,而其他人则没有,原因是有些人的母亲不在列表中,请查看以下示例文件:
var ANCESTRY_FILE = "['n " + [
'{"name": "Carolus Haverbeke", "sex": "m", "born": 1832, "died": 1905, "father": "Carel Haverbeke", "mother": "Maria van Brussel"}',
'{"name": "Emma de Milliano", "sex": "f", "born": 1876, "died": 1956, "father": "Petrus de Milliano", "mother": "Sophia van Damme"}',
'{"name": "Sophia van Damme", "sex": "f", "born": 1851, "died": 1956, "father": "Petrus de Milliano", "mother": "Someone"}',
'{"name": "Maria de Rycke", "sex": "f", "born": 1683, "died": 1724, "father": "Frederik de Rycke", "mother": "Laurentia van Vlaenderen"}'
] + " ]";
Emma de Milliano是Sophia van Damme的女儿,Sophia也在名单上(她出生于1851年),但Carolus Haverbeke是Maria van Brussel的儿子,但Maria不在名单中(我们对她一无所知),所以,如果你试图在字典(byName)中找到Maria,你什么都找不到。
为什么不能byName[person.mother]!=无效的被替换为person.mother=无效的我们不想基于null进行筛选吗?我不知道这两张支票有什么区别。
这个问题也与上一个问题有关。让我们记住相同的示例文件。
如果你试图在字典(byName)中找到不在示例文件中的人的名字,它实际上会返回undefined,而不是null,因为字典没有为该名字定义的值(它不存在)。所以,如果你做person.mother
,你只会得到那个人母亲的名字。但如果你做byName(person.mother)
,你不是在问母亲的名字(一个字符串),而是在问人(名字、性别、出生、死亡、父亲、母亲),这实际上是一个对象,而不是字符串。
我希望这个片段能帮助你,处理添加和删除人员(尤其是母亲)的文件,你会立即注意到发生了什么。
这能解释更多吗:
var obj = {};
var parent = {
name: 'The Parents Name',
parent: null
}
var child = {
name: 'The childs name',
parent: 'The Parents Name'
}
obj[parent.name] = parent;
obj[child.name] = child;
console.log(JSON.stringify(obj, null, 2));
使用[]
引用对象属性时,指的是属性上的名称,而不是值。即:
var obj = { key: 'value' };
// These two are identical
console.log(obj.key);
console.log(obj['key']);
这也意味着byName[person.mother]
返回对象,person.mother
返回名称。因此byName[person.name].mother != null;
被person.mother != null
取代
- 选择<李>使用普通JavaScript的子节点,而不是孙节点
- js循环遍历单击的元素子节点
- 如何将数据添加到json的子节点
- 删除HTML节点而不删除其子节点
- 如何在javascript DOM api中获取具有给定条件的子节点
- 仅使用某些子节点访问xml中父节点的子节点
- 检测单击子节点并发送槽事件处理程序
- 从 d3.js 中的树中选择节点的子节点
- 访问所选剑道树视图节点的子节点
- 为什么正文标记后的脚本标记在子节点中计数
- 难以获取使用属性选择的节点的子节点
- 使用Javascript设置带有子节点的父节点的类's文本等于.
- 如何确定父节点是否有子节点
- 在没有 jquery 的情况下更改子节点(父节点具有 ID)中的链接文本
- Javascript - 子节点计数
- 在子节点上重复
- 如何在D3.js基于力的标签布局图中获取公共子节点
- 如何访问React中的子节点
- js初学者-如何在比网页中的DOM节点低一个级别上立即解析所有子节点
- 层次结构和多选项下拉列表(HTML),并在项目之间导航(子节点)