Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用ramda.js重构此代码?_Javascript_Ramda.js - Fatal编程技术网

Javascript 如何使用ramda.js重构此代码?

Javascript 如何使用ramda.js重构此代码?,javascript,ramda.js,Javascript,Ramda.js,我正在使用mithril.js和ramda.js。我在mithril中有以下代码: return m('ul.list-inline.text-center', [ ctrl.items.map(item => R.allPass(item.policies)(item) ? m('li', m('a', { href: item.uri, config: m.route }, item.name)) : null) ]);

我正在使用
mithril.js
ramda.js
。我在mithril中有以下代码:

return m('ul.list-inline.text-center', [
     ctrl.items.map(item => R.allPass(item.policies)(item) ? m('li', m('a', {
          href: item.uri,
          config: m.route
      }, item.name)) : null)
]);
所以基本上我在迭代
ctrl.items
item.policies
只是一个返回
true/false
的简单函数数组。因此,
R.allPass(item.policies)(item)
如果所有内容都通过,则为
true
,否则为
false
,然后决定是否呈现
li
标记

因此,我认为创建这种功能性更强的方法会更好,因为我可以重用代码。因此,我想我应该使用
R.allPass
来过滤
项,而不是映射,然后只渲染过滤后的数组

我开始在ramda中摆弄一个简单的过滤器,但我不知道如何实现这个结果:

var filterItems = R.filter(
    R.pipe(
        R.prop('policies'),
        R.allPass               
    )
);

这只是返回完整的数组。它根本不排除任何项。

好吧,从我对您的类型的理解来看,问题是您希望函数可以执行双重任务

假设
包含如下对象列表:

const items = [
  {
    name: 'foo',
    val: 13,
    policies: [
      obj => obj.val > 10,
      obj => obj.val < 20,
      obj => obj.val % 2 == 1,
    ]
  },
  {
    name: 'bar',
    val: 14,
    policies: [
      obj => obj.val > 10,
      obj => obj.val < 20,
      obj => obj.val % 2 == 1,
    ]
  }
];
将有一个类似以下的类型:

const testPolicies = R.pipe(
    R.prop('policies'), // :: Item -> [(Item -> Boolean)]
    R.allPass           // :: [(Item -> Boolean)] -> Item -> Boolean
)                    // => :: Item -> Item -> Boolean
您需要将项目的两个副本传递到此函数,以使其返回布尔值。但您将其视为只使用一个,就好像它可以作为
filter::(Item->Boolean)->[Item]->[Item]
的输入一样

您需要一种方法将
(项->项->布尔)
转换为
(项->布尔)

Ramda没有任何东西来帮助这个,尽管也许Ramda应该考虑添加这个,因为它偶尔有用。但其中一个标准组合1(称为
W
)将执行以下操作:

const W = f => x => f(x)(x);
然后您可以这样使用它:

R.filter(W(testPolicies), items); //=>
// {
//   name: 'foo',
//   val: 13,
//   policies: [
//     obj => obj.val > 10,
//     obj => obj.val < 20,
//     obj => obj.val % 2 == 1,
//   ]
// }
R.filter(W(testPolicies),items);//=>
// {
//名称:“foo”,
//瓦尔:13,
//政策:[
//obj=>obj.val>10,
//obj=>obj.val<20,
//obj=>obj.val%2==1,
//   ]
// }
您可以在上看到这一点


1在中有一个很好的组合词列表

R.filter(W(testPolicies), items); //=>
// {
//   name: 'foo',
//   val: 13,
//   policies: [
//     obj => obj.val > 10,
//     obj => obj.val < 20,
//     obj => obj.val % 2 == 1,
//   ]
// }