如何在对象的道具上使用方法,然后是 return 对象

How to use a method on a prop of and object, then return object

我正在尝试使用 Ramda 重现 appendSearchParam 函数,即应用对象的 prop 方法,然后 returning 所述对象。

我最好的镜头是提供的 aSP 函数,但是这个函数没有 return url 对象,我严重怀疑我的 "nthArg" 是不是一个很好的实践。然后我尝试将 R.tap 与 aSP 一起使用,但没有结果。

import {
    URL
} from 'url'
import R from 'ramda'

const u = new URL('http://www.google.com')

const appendSearchParam = (url, key, value) => {
    url.searchParams.append(key, value)
    return url
}

const aSP = R.converge(
    R.invoker(2, 'append'),
    [
        R.nthArg(1),
        R.nthArg(2),
        R.prop('searchParams')
    ]
)

我不会说使用 nthArg 是不好的做法。但是我不确定索引是否正确。我认为应该是 nthArg(0)nthArg(1)

你可能想用 useWith 代替,在这种情况下你不需要使用 nthArgidentity 到 return keyvalue 分别。

const asp = useWith(
  invoker(2, 'append'), [
    identity,               // return key
    identity,               // return value
    prop('searchParams')]); // get 'searchParams' from url

问题不在于函数,而在于您正在与之交互的 API。如您所见,append 将 return undefined 但仍会附加您的查询:

const url = new URL('http://foo.bar');

console.log(url.searchParams.append('x', 42));
console.log(url);

我不确定无点函数在这里是否有意义,因为您需要引用 url 才能 return 它。

我可能会这样做:

const asp = curry((key, value, url) =>
  url.searchParams.append(key, value) || url);