问题提示: 使用本章中的示例数据集,计算母亲和孩子之间的平均年龄差异(孩子出生时母亲的年龄)。您可以使用本章前面定义的平均函数。
请注意,并非数据中提到的所有母亲本身都存在于数组中。 byName对象可以很容易地从他们的名字中找到一个人的对象,这里可能很有用。
我的方法
用" mother"创建一个对象作为键,数组包含"母亲的DOB,女儿的名字,女儿的DOB"。
计算母亲与婴儿同龄的女儿的年龄[" - "母亲的DOB"
将值传递给提供的平均函数,写为
function average(array){ function plus(a,b){ 返回a + b; } return array.reduce(plus)/ array.length; }
我被困在第1步
第1步 - 分为子步骤
一个。删除所有数据点,其中mother = null&&母亲的DOB未知(她的名字被列为"母亲",但她没有单独的条目)
Filter out all "null" entries:
var hasMom = ancestry.filter(function(person) {
return person.mother != null;});
映射一组只有母姓的名字:
var momSet = hasMom.map(function(person) {return person.mother;});
创建将测试条目是否包含在集合
中的函数function isInSet(set, person) {return set.indexOf(person.name) > -1};
在过滤器中应用功能
var hasKnownMother = hasMom.filter(function(person)
{return isInSet(momSet, person)});
湾用他们的女儿和DOB创建这些母亲的byName对象
var byName = {};
hasKnownMother.forEach(function(person) {
byName[person.name] = [person.born, person.mother];});
问题:此时,我已将34个条目过滤为仅10个。交叉检查名称和条目,我没有得到我想要的结果。
我做错了什么?我应该重新考虑什么?
℃。搜索.JS文件中的母亲姓名,将她的DOB添加(推送?)到byName对象
问题:如果我想搜索byName对象的键(母名),将它们与祖先.JS数据库键匹配,并添加.JS的DOB条目,我不知道该怎么办到我的byName对象。
我在想一个For In循环,还是一个绑定?
答案 0 :(得分:1)
我认为最有效的方法是使用name作为键来构建一个人的哈希值,这样你就不会经常迭代了。之后,您可以再次迭代原始数组,这次检查数据是否存在于数据中并将差异推送到输出数组。
var ancestryJSON = JSON.parse(ANCESTRY_FILE),
byName = {},
ageDifferences = [];
function initNameHash(){
for(var i = 0, len = ancestryJSON.length; i < len; i++){
byName[ancestryJSON[i].name] = ancestryJSON[i];
}
}
function setAgeDifferences(){
for(var i = 0, len = ancestryJSON.length; i < len; i++){
var child = ancestryJSON[i];
if(child.mother !== null &&
byName[child.mother] !== undefined){
var mother = byName[child.mother];
var ageDifference = child.born - mother.born;
ageDifferences.push(ageDifference);
}
}
}
function average(array) {
function plus(a, b) { return a + b; }
return array.reduce(plus) / array.length;
}
initNameHash();
setAgeDifferences();
console.log(ageDifferences);
alert(average(ageDifferences));