4

我正在尝试使以下功能无点。不过,我不确定如何将争论传递给内部函数。我正在使用 Ramda.js,但我认为这个概念比这更笼统。这是我的代码。

search = function(id) {
  return find(propEq('id', id), items)
}

在这里,您会注意到id参数被传递给内部函数propEq。这是我不确定的部分。

4

3 回答 3

9

这个问题比 Ramda 更笼统,但 Ramda 确实有几个函数可以让这样的事情变得更容易,尤其是useWithconverge.

这可以useWith像这样写成无积分:

var search = useWith(find, propEq('id'), identity);
search(2, items); //=> {id:  2}

您可以在 Ramda REPL 上看到它的运行情况。

于 2015-08-05T10:48:48.150 回答
4

稍加修改就可以得到一个无点版本,但是自动柯里化会出现问题,所以我不得不通过手动柯里化函数来复制一些功能。这是一个班轮:

search = compose(flip(find)(items), propEq('id'))

为简洁起见,使用 ES6 语法:

var {compose} = R

var find = f => xs => R.find(f, xs)
var propEq = p => x => R.propEq(p, x)
var flip = f => a => b => f(b)(a)

// Example:

var items = [{id: 1}, {id: 2}, {id: 3}]

// point-full
var search = function(id) {
  return find(propEq('id')(id))(items)
}

console.log(search(2))

// point-free
search = compose(flip(find)(items), propEq('id'))

console.log(search(2))

但这毫无意义。

演示: http: //jsbin.com/batedi/edit ?js,output

于 2015-08-05T06:08:28.823 回答
0

你只需要先咖喱它。然后你可以先给它 id,items 将是它前面的函数的输出。

前任:

const search = R.curry((id, items) => R.find(R.propEq('id', id), items));

const testSearch = R.pipe(
  R.identity(() => [{id: '123'}, {id: 'asdf'}]),
  search('123')
);

testSearch(); // { id: '123' }
于 2017-06-13T10:00:09.040 回答