javascript - 理解对象时遇到问题(获取母节点和子节点之间的年龄差异)

标签 javascript

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

问题陈述基本上是为了得到母亲和 child 之间差异的平均值。下面是答案

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]),我会得到一堆未定义的值,但有时我会得到一个对象?难道一切不都应该是未定义吗?我们从未将 obj[person.mother] 设置为任何内容。

其次,为什么不能将 byName[person.mother] != null; 替换为 person.mother !=null ?我们不想根据 nulls 进行过滤吗?我无法判断这两项检查之间有什么区别。

谢谢!

最佳答案

我已经设置了一个工作示例,因为您的示例抛出了很多错误,请检查此代码片段: https://repl.it/Cidr

现在,回答您的问题:

How come if I try to console.log(obj[person.mother]), I get a bunch of undefined values, but sometimes I get an object? Shouldn't everything be undefined? We never set obj[person.mother] to anything.

我猜 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 不在名单中(我们不知道)对她一无所知),因此,如果您尝试在字典中(按名字)查找玛丽亚,您将找不到任何内容。

Why can't byName[person.mother] != null; be replaced with person.mother !=null? Don't we want to filter based on nulls? I can't tell what the difference is here between those two checks.

这个问题也与上一个问题相关。让我们记住相同的示例文件。

如果你尝试在字典(byName)中查找不在示例文件中的某人的名字,它实际上会返回 undefined,而不是 null,因为字典没有该名字的定义值(它没有不存在)。 因此,如果您执行person.mother,您将只得到该人母亲的名字。 但是如果你执行byName(person.mother),你就不是在询问母亲的名字(字符串),而是在询问这个人(姓名、性别、出生、死亡、父亲、母亲) )实际上是一个对象,而不是字符串。

我希望该代码片段对您有所帮助,尝试添加和删除人员(尤其是母亲)的文件,您会立即注意到发生了什么。

关于javascript - 理解对象时遇到问题(获取母节点和子节点之间的年龄差异),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38724628/

相关文章:

Javascript矩阵数组问题

javascript - 如何使用国家/地区代码或国家/地区名称获取国家/地区拨号代码?

javascript - Nodejs 哈巴狗扩展

javascript - 是否可以使用 WebRTC getusermedia 和 HTML5 访问整个屏幕?

javascript - 如何在 Firefox 扩展中使用 jQuery

javascript - 如何获取使用chartjs创建的canvas图表的data属性

javascript - 闭包编译器不会缩小匿名函数内的函数

javascript - 调整大小后检查浏览器宽度,无需重新加载(Javascript)

javascript - 为什么回调函数中 "this"指向 "window Object"呢?

javascript - 获取并检查数组的 javascript 数组