雄辩的Javascript练习5.2。帮助组织思想

时间:2015-07-13 13:51:38

标签: javascript arrays object

问题提示: 使用本章中的示例数据集,计算母亲和孩子之间的平均年龄差异(孩子出生时母亲的年龄)。您可以使用本章前面定义的平均函数。

请注意,并非数据中提到的所有母亲本身都存在于数组中。 byName对象可以很容易地从他们的名字中找到一个人的对象,这里可能很有用。

JS文件:http://eloquentjavascript.net/code/ancestry.js

我的方法

  1. 用" mother"创建一个对象作为键,数组包含"母亲的DOB,女儿的名字,女儿的DOB"。

  2. 计算母亲与婴儿同龄的女儿的年龄[" - "母亲的DOB"

  3. 将值传递给提供的平均函数,写为

    function average(array){ function plus(a,b){  返回a + b; } return array.reduce(plus)/ array.length; }

  4. 我被困在第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循环,还是一个绑定?

1 个答案:

答案 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));

检查小提琴:https://jsfiddle.net/oafd8hgL/