【问题标题】:lodash/fp transform not working as expectedlodash/fp 转换未按预期工作
【发布时间】:2019-07-22 15:27:53
【问题描述】:

我想为lodash repo 提供一个修复程序,但我想我应该先检查一下我没有做错什么...

当我在这个例子中使用标准 lodash...

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();

输出是{ hello: true, world: false },如我所料。

在上述代码中记录 a、v、k 和 o 时,输出为...

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 } }

但是,当我使用 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();

输出为{ undefined: false }。这是因为迭代器的参数似乎不正确。当我记录 a、v、k 和 o 时,我得到以下输出...

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

是我做错了什么还是没有按预期工作?

我也在 repo 中添加了这个问题,但我想我会在这里添加,因为也许我会得到更快的响应:D

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

【问题讨论】:

  • 从未使用过 fp,但只是去了 Guide wiki 并且参数 # 不同 github.com/lodash/lodash/wiki/FP-Guide Methods that cap iteratees to two arguments: reduce, reduceRight, & transform
  • @charlietfl 是的,这就是我在代码中所做的。在原始代码中,它接受三个参数,对象、函数和累加器。在fp 代码中,它有两个参数,函数和累加器。然后它返回一个将对象作为唯一参数的函数。
  • 我从中读到的是 iteratee 是变换函数......它只有 2 个参数
  • @charlietfl 哦...我现在明白了...一秒钟,需要检查一下...谢谢:D
  • 可以通过使用常规函数而不是箭头函数轻松检查参数长度并检查参数数组

标签: javascript node.js lodash


【解决方案1】:

试试这个:

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

pen

【讨论】:

  • 我明天试试。谢谢。
【解决方案2】:

好的,这很奇怪,但我可以让它工作。

当使用lodash/fp 时,iteratee 的自动补全会显示函数签名,如...

function(accumulator, currentValue) {}

所以它只接受两个参数(这是@charlietfl 链接的文档中所说的)。

但是,当我创建这样的函数时......

function(a, v) {
  console.log(arguments.length);
}

它输出4

所以我一直在探索……

function(a, v) {
  console.log(arguments[0]);
  console.log(arguments[1]);
  console.log(arguments[2]);
  console.log(arguments[3]);
}

这输出...

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

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

就像我想要的那样。因此,即使函数只声明了 2 个参数并且只接受 2 个参数,但实际上传递了 4 个参数。

所以,当我像这样更新代码时......

function(a, v) {
  const k = arguments[2];
  a[mapping[k]] = v.value;
}

这将返回{ hello: true, world: false },这是我最初希望得到的。

我可以通过这种方式绕过它,但不明白为什么会这样。所以,正因为如此,我将坚持我目前的 mapKeys 方法,然后是 mapValues 和 TBH ......我可能会考虑在不久的将来放弃 lodash 并编写我自己的函数替换此功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多