Search code examples
javascriptnode.jslodash

lodash/fp transform not working as expected


I wanted to contribute a fix for this to the lodash repo but thought I should check that I'm not doing something wrong first...

When I use standard lodash in this example...

const _ = require('lodash');

run = () => {
  const mapping = {
    a: 'hello',
    b: 'world'
  };

  const object = {
    a: { value: true },
    b: { value: false }
  };

  // this is the original transform function that takes three arguments...
  // 1. the object to be transformed
  // 2. the transform function
  // 3. the accumulator object
  const transformed = _.transform(
    object,
    (a, v, k, o) => { a[mapping[k]] = _.get(v, 'value'); },
    {}
  );

  console.log(transformed);
};

run();

The output is { hello: true, world: false } like I expected.

When logging a, v, k, and o on the above code the output is...

1 a: {}
1 v: { value: true }
1 k: a
1 o: { a: { value: true }, b: { value: false } }

2 a: { hello: true }
2 v: { value: false }
2 k: b
2 o: { a: { value: true }, b: { value: false } }

However, when I run (what I think is) the equivalent code using lodash/fp...

const _ = require('lodash/fp');

run = () => {
  const mapping = {
    a: 'hello',
    b: 'world'
  };

  const object = {
    a: { value: true },
    b: { value: false }
  };

  // this is the fp transform function that takes two arguments...
  // 1. the transform function
  // 2. the accumulator object
  // it then returns a function that takes one argument...
  // 1. the object to be transformed
  const transformed = _.transform(
    (a, v, k, o) => { a[mapping[k]] = _.get('value')(v); },
    {}
  )(object);

  console.log(transformed);
};

run();

The output is { undefined: false }. This is because the parameters to the iterator do not seem to be correct. When I log a, v, k, and o I get the following output...

1 a: {}
1 v: { value: true }
1 k: undefined
1 o: undefined

2 a: { undefined: true }
2 v: { value: false }
2 k: undefined
2 o: undefined

Am I doing something wrong or is this not working as expected?

I have also added this as an issue on the repo but thought I'd add here as maybe I would get a faster response :D

https://github.com/lodash/lodash/issues/4381


Solution

  • Try this:

    const transform = _.transform.convert({ cap: false });
    const transformed = transform(
      (a, v, k, o) => { a[mapping[k]] = _.get('value')(v); },
      {}
    )(object);
    

    pen