Javascript Ramda:从谓词数组中拒绝

Javascript Ramda:从谓词数组中拒绝,javascript,ramda.js,Javascript,Ramda.js,如何报告谓词数组的拒绝,而仅报告第一个拒绝 这是我的尝试,但我觉得有一些ramda函数可以使它更通用,例如,如果我有10个谓词 var selected = [{ Label: "a", Invalid: false, Deleted: true }, { Label: "b", Invalid: false, Deleted: false }, { Label: "c", Invalid: true,

如何报告谓词数组的拒绝,而仅报告第一个拒绝

这是我的尝试,但我觉得有一些ramda函数可以使它更通用,例如,如果我有10个谓词

var selected = [{
  Label: "a",
  Invalid: false,
  Deleted: true
}, {
  Label: "b",
  Invalid: false,
  Deleted: false
}, {
  Label: "c",
  Invalid: true,
  Deleted: false
}];


var canEditPredicates = [
  R.propEq("Deleted", false),
  R.propEq("Invalid", false),
  R.propEq("Label", "c")
];




var deleted = R.reject(canEditPredicates[0], selected);
var invalid = R.reject(canEditPredicates[1], R.without(deleted, selected));
var names = R.reject(canEditPredicates[2], R.without(deleted, R.without(invalid, selected)));

var rv = "The following items are bad:";



if (deleted.length) {
  rv += "\r\nDeleted items: " + R.join(", ")(R.pluck("Label")(deleted));
}

if (invalid.length) {
  rv += "\r\ninvalid items: " + R.join(", ")(R.pluck("Label")(invalid));
}
if (names.length) {
  rv += "\r\nnames items: " + R.join(", ")(R.pluck("Label")(names));
}


console.log(rv);
输出

The following items are bad:
Deleted items: a
invalid items: c
names items: b

要了解项被拒绝的原因(谓词的索引),可以使用翻转的R.findIndex,它接受谓词数组。谓词应该得到补充,因为我们希望
true
用于失败的答案。传递给fins的值应该用R.applyTo包装,因为R.find需要一个谓词函数

然后可以映射项数组,传递值,并获取每个失败项的谓词索引。如果该项通过了所有检查(未通过),您将得到
-1
,而不是谓词索引

const{propEq,map,pipe,applyTo,flip,findIndex,complete}=R;
常量Canedit谓词=[
propEq(“已删除”,错误),
propEq(“无效”,错误),
propEq(“标签”、“c”)
];
const findFailedPredicateIndex=pipe(applyTo,flip(findIndex)(map(complete,canEditPredicates));
const findFailed=map(findFailedPredicateIndex);
const selected=[{“Label”:“a”,“Invalid”:false,“Deleted”:true},{“Label”:“b”,“Invalid”:false,“Deleted”:false},{“Label”:“c”,“Invalid”:true,“Deleted”:false},{“Label”:“c”,“Invalid”:false,“Deleted”:false};
const result=findFailed(已选择);
控制台日志(结果)

此版本对您的输入有多种自由。它们可能没有道理。但在我看来,它们似乎构成了一个更符合逻辑的系统。如果变化太大,请随意忽略

它所做的最大的事情是反转谓词的意义。这些版本现在被列为
cannotEditPredicates
,而不是
canEditPredicates
。这使我们能够更简单地编写它们。例如,
Deleted
谓词可以只是
R.prop(“Deleted”)
,而不是
R.prop('Deleted',false)

我还对它们进行了不同的捆绑,以使我们能够更清晰地捕获失败结果。它们不是数组,而是收集在一个对象中,该对象由您在预期输出中使用的名称键入

这给了我们一个输出结构,如

{
删除:[“a”、“e”],
无效:[“c”],
姓名:[“b”]
}
但是我们可以简单地将其更改为包含整个对象,而不是标签

这就是它看起来的样子:

const rejectPreds=(选中,cannotEditPredicates)=>R.reduce(
(输出,项目)=>{
const rec=R.find([k,v])=>v(item))(R.toPairs(cannotedits谓词))
return rec==未定义
?输出
:{…输出[rec[0]]:[…输出[rec[0]],项.标签]}
},
R.map(v=>[])(cannotedit谓词),
挑选出来的
)
所选常数=[
{标签:“a”,无效:false,删除:true},
{标签:“b”,无效:错误,删除:错误},
{标签:“c”,无效:真,删除:假},
{标签:“d”,无效:false,删除:false},
{标签:“e”,无效:false,删除:true}
];
const cannotedits谓词={
删除:R.prop(“删除”),
无效:R.prop(“无效”),
名称:R.propEq(“标签”、“b”)
}
const rejected=rejectPreds(选定,Cannotedit谓词)
console.log(已拒绝)
console.log(`以下项目不正确:
${Object.entries(已拒绝).map([n,v])=>`${n}:[${[…v]}]`.join('\n')}
`)
。作为控制台包装{最大高度:100%!重要;顶部:0}

是的,但我需要知道每一个被拒绝的原因,知道导致第一次拒绝的canEditPredicates的索引是可以接受的。