当有局部变量时如何使其无点?

How to make it point-free when there is local variable?

我有一个代码片段可以从 OpenAPI 定义中的服务器 URL 中删除主机部分。我不知道如何让它完全没有意义。 (没有必要这样做。但我只是想知道怎么做。)

对我来说困难的部分是摆脱局部变量idx。我看了这个SO,好像ap可以解决。我没有尝试,因为lodash中没有ap

const convert = _.flow([
  _.split('/'),
  (segments) => {
    const idx = _.findLastIndex(containAny(['{', '}', ':']))(segments);
    return _.drop(idx+1, segments);
  },
  _.reject(_.isEmpty),
  _.join('/'),
  path => '/' + path,
]);

完整代码:

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

const urls = [
  'http://localhost:8080/petstore/v1',
  '//localhost/petstore/v1',
  '{server}/batch-service/api/batches/lwm2m/v1',
  'https://{server}/batch-service/api/batches/lwm2m/v1',
  '/batch-service/api/batches/lwm2m/v1',
  '/',
]

const containAny = patterns => str => _.some(pattern => _.includes(pattern, str), patterns);

const convert = _.flow([
  _.split('/'),
  (segments) => {
    const idx = _.findLastIndex(containAny(['{', '}', ':']))(segments);
    return _.drop(idx+1, segments);
  },
  _.reject(_.isEmpty),
  _.join('/'),
  path => '/' + path,
]);

_.map(convert)(urls);

在您的情况下,您需要在 segments 上调用 _.findLastIndex(),然后在查找结果上调用 _.drop()segments:

drop(findLastIndex(segments))(segments)

相当于chain combinator函数:

const chain = f => g => x => f(g(x))(x);

Lodash/fp 在使用 _.flow() 时接受所有函数(这也是一个函数组合器),因此您可以创建其他函数组合器,并使用它们。

const chain = f => g => x => f(g(x))(x);

const containAny = patterns => str => _.some(pattern => _.includes(pattern, str), patterns);

const findLastSegmentIndex = _.flow(
  _.findLastIndex(containAny(['{', '}', ':'])),
  _.add(1)
)

const convert = _.flow([
  _.split('/'),
  chain(_.drop)(findLastSegmentIndex),
  _.reject(_.isEmpty),
  _.join('/'),
  path => '/' + path,
]);

const urls = [
  'http://localhost:8080/petstore/v1',
  '//localhost/petstore/v1',
  '{server}/batch-service/api/batches/lwm2m/v1',
  'https://{server}/batch-service/api/batches/lwm2m/v1',
  '/batch-service/api/batches/lwm2m/v1',
  '/',
];

const result = _.map(convert)(urls);

console.log(result);
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>

你需要 convergelodash 没有,但 Ramda 有。 它将不同的函数应用于同一个参数,然后将这些应用程序的结果用作另一个给定函数的参数。

const convert = _.flow([
  _.split('/'),
  R.converge(_.drop, [_.flow([_.findLastIndex(containAny(['{', '}', ':'])), add(1)]), _.identity]),
  _.reject(_.isEmpty),
  _.join('/'),
  path => '/' + path,
]);

https://ramdajs.com/docs/#converge