2
var take = R.curry(function take(count, o) {
    return R.pick(R.take(count, R.keys(o)), o);
});

此函数count按照它们出现的顺序从对象中获取键。我用它来限制分组的数据集。

我知道有占位符参数,例如R.__,但我无法解决这个特殊情况。

4

2 回答 2

1

这可能要归功于R.converge,但我不建议在这种情况下使用无点。

//  take :: Number -> Object -> Object
var take = R.curryN(2,
                    R.converge(R.pick,
                               R.converge(R.take,
                                          R.nthArg(0),
                                          R.pipe(R.nthArg(1),
                                                 R.keys)),
                               R.nthArg(1)));

需要注意的一点是,这个函数的行为是未定义的,因为返回的列表的顺序R.keys是未定义的。

于 2015-04-16T23:36:18.387 回答
1

我同意@davidchambers 的观​​点,最好不要不加分。这个解决方案比那个更干净,但在我看来仍然没有你原来的那么好:

// take :: Number -> Object -> Object
var take = R.converge(
    R.pick, 
    R.useWith(R.take, R.identity, R.keys), 
    R.nthArg(1)
);

useWith并且converge相似之处在于它们接受许多函数参数并将调用除第一个以外的所有参数的结果传递给第一个。不同之处在于converge将它接收到的所有参数传递给每个参数,并将useWith它们拆分,将一个参数传递给每个函数。这是我第一次看到组合它们的用途,但在这里似乎很有意义。

该属性排序问题应该在 ES6 中得到解决(最终草案现已发布!)但它仍然存在争议


更新

你提到这需要一些时间来解决这个问题。这至少应该有助于显示它如何等同于您的原始函数,如果不是如何派生它:

var take = R.converge(
    R.pick, 
    R.useWith(R.take, R.identity, R.keys), 
    R.nthArg(1)
);
    // definition of `converge`
(count, obj) => R.pick(R.useWith(R.take, R.identity, R.keys)(count, obj), 
        R.nthArg(1)(count, obj));
    // definition of `nthArg`
(count, obj) => R.pick(R.useWith(R.take, R.identity, R.keys)(count, obj), obj);
    // definition of `useWith`
(count, obj) => R.pick(R.take(R.identity(count), R.keys(obj)), obj);
    // definition of `identity`
(count, obj) => R.pick(R.take(count, R.keys(obj)), obj);

更新 2

版本 18开始,两者convergeuseWith都已更改为二进制。每个都有一个目标函数和一个辅助函数列表。这会将上述内容稍微更改为:

// take :: Number -> Object -> Object
var take = R.converge(R.pick, [
    R.useWith(R.take, [R.identity, R.keys]), 
    R.nthArg(1)
]);
于 2015-04-17T20:15:35.307 回答