Search code examples
javascriptlodash

_.filter function does not work with _.partialRight constructed function


The _.filter function does not work with _.partialRight constructed function, but works with a custom function. See below example:

import _ from 'lodash';

const students = [
  {firstName: "Mary"},
  {firstName: "Jane"},
  {firstName: "John"},
];

function firstNameStartsWith(student, letter) {
  return _.startsWith(student.firstName, letter);
}

_.filter(students, _.partialRight(firstNameStartsWith, "J"));
// []

_.filter(students, student => firstNameStartsWith(student, "J"));
// [ { firstName: 'Jane' }, { firstName: 'John' } ]

Can someone explain why?


Solution

  • The _.filter() function passes 3 parameters to the predicate - value, index, and the original array. The index overrides the partially applied value, and you get the wrong result. This happens because "partially applied arguments are appended to the arguments it receives". You can fix this by limiting the partially applied function to a single parameter using _.unary():

    const students = [
      {firstName: "Mary"},
      {firstName: "Jane"},
      {firstName: "John"},
    ];
    
    function firstNameStartsWith(student, letter) {
      return _.startsWith(student.firstName, letter);
    }
    
    const result = _.filter(students, _.unary(_.partialRight(firstNameStartsWith, "J")));
    
    console.log(result);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>