当有局部变量时如何使其无点?
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>
你需要 converge
,lodash
没有,但 Ramda 有。
它将不同的函数应用于同一个参数,然后将这些应用程序的结果用作另一个给定函数的参数。
const convert = _.flow([
_.split('/'),
R.converge(_.drop, [_.flow([_.findLastIndex(containAny(['{', '}', ':'])), add(1)]), _.identity]),
_.reject(_.isEmpty),
_.join('/'),
path => '/' + path,
]);
我有一个代码片段可以从 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>
你需要 converge
,lodash
没有,但 Ramda 有。
它将不同的函数应用于同一个参数,然后将这些应用程序的结果用作另一个给定函数的参数。
const convert = _.flow([
_.split('/'),
R.converge(_.drop, [_.flow([_.findLastIndex(containAny(['{', '}', ':'])), add(1)]), _.identity]),
_.reject(_.isEmpty),
_.join('/'),
path => '/' + path,
]);