Hello and welcome to our community! Is this your first visit?
Register
Enjoy an ad free experience by logging in. Not a member yet? Register.
Results 1 to 4 of 4
Like Tree1Likes
  • 1 Post By rnd me

Thread: Need help to understand Higher order functions from javascript

  1. #1
    New to the CF scene
    Join Date
    Apr 2014
    Posts
    5
    Thanks
    3
    Thanked 0 Times in 0 Posts

    Question Need help to understand Higher order functions from javascript

    I am a newbie to javascript. I am reading a book named eloquentjavascript and having trouble understanding some higher order functions and their use.
    Here is the question that i am trying to solve. There is one ancestry file on which we have to perform following task. I know I have written something crap. But I am not getting how to access every person from byName object. Please help me..

    http://http://eloquentjavascript.net...her_order.html

    Mother-child age difference

    Using the example data set from this chapter, compute the average age difference between mothers and children. You can use the average function defined above.

    Note that not all the mothers mentioned in the data are themselves present in the array. The byName object, which makes it easy to find a person’s object from their name, might be useful here.

    Code:
    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;
    });
    
    
    function ageDiff(person) {
      function hasKnownMother (person) {
      	var mother = byName[person.mother];
      		if (mother !== null) 
              return filter(ageOf(mother));
      		else 
              return null;
      }
      return (ageOf(mother) - ageOf(person));
    }
    
    function ageOf (p) {
      return p.died - p.born;
    }
    
    var mom = ancestry.map(hasKnownMother);
    console.log(average(ancestry.map(ageDiff)));

  • #2
    Senior Coder rnd me's Avatar
    Join Date
    Jun 2007
    Location
    Urbana
    Posts
    4,444
    Thanks
    11
    Thanked 598 Times in 578 Posts
    it's pretty simple, but we need to see the data you are processing in order to give specific advice. I checked the site you linked, even google around for it, but i can't find the data they speak of, which makes me wonder what you're using.

    EDIT: found it:

    PHP Code:
    data=[
      {
    "name""Emma de Milliano""sex""f""born"1876"died"1956"father""Petrus de Milliano""mother""Sophia van Damme"},
      {
    "name""Carolus Haverbeke""sex""m""born"1832"died"1905"father""Carel Haverbeke""mother""Maria van Brussel"},
      {
    "name""Maria de Rycke""sex""f""born"1683"died"1724"father""Frederik de Rycke""mother""Laurentia van Vlaenderen"},
      {
    "name""Jan van Brussel""sex""m""born"1714"died"1748"father""Jacobus van Brussel""mother""Joanna van Rooten"},
      {
    "name""Philibert Haverbeke""sex""m""born"1907"died"1997"father""Emile Haverbeke""mother""Emma de Milliano"},
      {
    "name""Jan Frans van Brussel""sex""m""born"1761"died"1833"father""Jacobus Bernardus van Brussel""mother":null},
      {
    "name""Pauwels van Haverbeke""sex""m""born"1535"died"1582"father""N. van Haverbeke""mother":null},
      {
    "name""Clara Aernoudts""sex""f""born"1918"died"2012"father""Henry Aernoudts""mother""Sidonie Coene"},
      {
    "name""Emile Haverbeke""sex""m""born"1877"died"1968"father""Carolus Haverbeke""mother""Maria Sturm"},
      {
    "name""Lieven de Causmaecker""sex""m""born"1696"died"1724"father""Carel de Causmaecker""mother""Joanna Claes"},
      {
    "name""Pieter Haverbeke""sex""m""born"1602"died"1642"father""Lieven van Haverbeke""mother":null},
      {
    "name""Livina Haverbeke""sex""f""born"1692"died"1743"father""Daniel Haverbeke""mother""Joanna de Pape"},
      {
    "name""Pieter Bernard Haverbeke""sex""m""born"1695"died"1762"father""Willem Haverbeke""mother""Petronella Wauters"},
      {
    "name""Lieven van Haverbeke""sex""m""born"1570"died"1636"father""Pauwels van Haverbeke""mother""Lievijne Jans"},
      {
    "name""Joanna de Causmaecker""sex""f""born"1762"died"1807"father""Bernardus de Causmaecker""mother":null},
      {
    "name""Willem Haverbeke""sex""m""born"1668"died"1731"father""Lieven Haverbeke""mother""Elisabeth Hercke"},
      {
    "name""Pieter Antone Haverbeke""sex""m""born"1753"died"1798"father""Jan Francies Haverbeke""mother""Petronella de Decker"},
      {
    "name""Maria van Brussel""sex""f""born"1801"died"1834"father""Jan Frans van Brussel""mother""Joanna de Causmaecker"},
      {
    "name""Angela Haverbeke""sex""f""born"1728"died"1734"father""Pieter Bernard Haverbeke""mother""Livina de Vrieze"},
      {
    "name""Elisabeth Haverbeke""sex""f""born"1711"died"1754"father""Jan Haverbeke""mother""Maria de Rycke"},
      {
    "name""Lievijne Jans""sex""f""born"1542"died"1582"father":null"mother":null},
      {
    "name""Bernardus de Causmaecker""sex""m""born"1721"died"1789"father""Lieven de Causmaecker""mother""Livina Haverbeke"},
      {
    "name""Jacoba Lammens""sex""f""born"1699"died"1740"father""Lieven Lammens""mother""Livina de Vrieze"},
      {
    "name""Pieter de Decker""sex""m""born"1705"died"1780"father""Joos de Decker""mother""Petronella van de Steene"},
      {
    "name""Joanna de Pape""sex""f""born"1654"died"1723"father""Vincent de Pape""mother""Petronella Wauters"},
      {
    "name""Daniel Haverbeke""sex""m""born"1652"died"1723"father""Lieven Haverbeke""mother""Elisabeth Hercke"},
      {
    "name""Lieven Haverbeke""sex""m""born"1631"died"1676"father""Pieter Haverbeke""mother""Anna van Hecke"},
      {
    "name""Martina de Pape""sex""f""born"1666"died"1727"father""Vincent de Pape""mother""Petronella Wauters"},
      {
    "name""Jan Francies Haverbeke""sex""m""born"1725"died"1779"father""Pieter Bernard Haverbeke""mother""Livina de Vrieze"},
      {
    "name""Maria Haverbeke""sex""m""born"1905"died"1997"father""Emile Haverbeke""mother""Emma de Milliano"},
      {
    "name""Petronella de Decker""sex""f""born"1731"died"1781"father""Pieter de Decker""mother""Livina Haverbeke"},
      {
    "name""Livina Sierens""sex""f""born"1761"died"1826"father""Jan Sierens""mother""Maria van Waes"},
      {
    "name""Laurentia Haverbeke""sex""f""born"1710"died"1786"father""Jan Haverbeke""mother""Maria de Rycke"},
      {
    "name""Carel Haverbeke""sex""m""born"1796"died"1837"father""Pieter Antone Haverbeke""mother""Livina Sierens"},
      {
    "name""Elisabeth Hercke""sex""f""born"1632"died"1674"father""Willem Hercke""mother""Margriet de Brabander"},
      {
    "name""Jan Haverbeke""sex""m""born"1671"died"1731"father""Lieven Haverbeke""mother""Elisabeth Hercke"},
      {
    "name""Anna van Hecke""sex""f""born"1607"died"1670"father""Paschasius van Hecke""mother""Martijntken Beelaert"},
      {
    "name""Maria Sturm""sex""f""born"1835"died"1917"father""Charles Sturm""mother""Seraphina Spelier"},
      {
    "name""Jacobus Bernardus van Brussel""sex""m""born"1736"died"1809"father""Jan van Brussel""mother""Elisabeth Haverbeke"}
    ];

    // our temp storage variables:
    var allDiffsyearByName = {};

    // build a lookup table to quickly turn names into years of birth:
    data.forEach(function(person) {
      
    this[person.name] = person.born;
    }, 
    yearByName );

    // find differences between year of birth or moths and children:
    allDiffs=data.map(function(a){
      return 
    this[a.name] - this[a.mother]
    }, 
    yearByName)
    .
    filter(Number); // screens out null/NaN using a Number filter

    // now that we have a list of all valid age differences, compute the average by summing and dividing by count:
    allDiffs.reduce(function (e,t){return e+t}) / allDiffs.length
    note that i used pure functions instead of hard-coding variable names and relying on performance-robbing closure.
    for example, "this[a.name]" instead of "yearByName[a.name]" like used by the author.
    while a little less-readable, pure functions execute much faster and are easier to re-apply in other code.
    it;s always a good idea to separate concerns as much as feasible, in this case logic from data.

    also ignore the author's warning about execution speed of loops vs [].forEach/map/filter/etc.
    while a few years back, loops were over twice as fast, these days loops are only slightly faster, and in some cases, array methods will be faster due to caching, and you can memoize functions but not loops if speed is of the upmost concern.
    Last edited by rnd me; 04-10-2014 at 06:23 PM.
    Purva13 likes this.
    my site (updated 2014/10/20)
    BROWSER STATS [% share] (2014/9/03) IE7:0.1, IE8:4.3, IE11:9.2, IE9:2.7, IE10:2.6, FF:16.8, CH:47.5, SF:7.8, NON-MOUSE:37%

  • Users who have thanked rnd me for this post:

    Purva13 (04-11-2014)

  • #3
    New to the CF scene
    Join Date
    Apr 2014
    Posts
    5
    Thanks
    3
    Thanked 0 Times in 0 Posts
    Nice. I took me a while to understand. But finally got it. Thank you so much for helping me.

  • #4
    New to the CF scene
    Join Date
    Apr 2014
    Posts
    5
    Thanks
    3
    Thanked 0 Times in 0 Posts
    Can you please suggest me some book or reference for learning higher order functions? I am really having hard time understanding how to use these functions. I understood how these functions work but am unable to use them on my own.


  •  

    Tags for this Thread

    Posting Permissions

    • You may not post new threads
    • You may not post replies
    • You may not post attachments
    • You may not edit your posts
    •