理解对象的问题(获取母子节点之间的年龄差)

Trouble with understanding objects ( Getting the age difference between mother and child nodes)

本文关键字:之间 子节点 获取 对象 问题 母子      更新时间:2023-09-26

我目前正在复习书中的一堆旧练习,在理解对象的关键概念时遇到了一些困难,所以这是我的问题。考虑以下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 取代