Javascript 从具有特定id的对象的数组生成新数组

Javascript 从具有特定id的对象的数组生成新数组,javascript,arrays,object,ramda.js,Javascript,Arrays,Object,Ramda.js,我们在项目中使用ramda,我有这个数据结构,我需要做以下事情: 对于每个集合,检查SubmittedCheckBox是否在其中,并将它们隔离到新阵列,以便我可以知道是否未超过设置为true的复选框的有效数量 在下面的示例中,它应该抛出指示集合1的id的错误,因为两个SubmittedCheckBox的值为:true,其中集合指定了有效的\u金额:[1],但集合2应该可以,因为有效的\u金额选项为1或2,有效的\u金额:[1,2]。 最后一组应接受属于它的所有复选框 const sets = [

我们在项目中使用ramda,我有这个数据结构,我需要做以下事情:

对于每个集合,检查SubmittedCheckBox是否在其中,并将它们隔离到新阵列,以便我可以知道是否未超过设置为true的复选框的有效数量

在下面的示例中,它应该抛出指示集合1的id的错误,因为两个SubmittedCheckBox的值为:true,其中集合指定了有效的\u金额:[1],但集合2应该可以,因为有效的\u金额选项为1或2,有效的\u金额:[1,2]。 最后一组应接受属于它的所有复选框

const sets = [
  {id: 1, checkboxes: [{id: 10}, {id: 20}], valid_amount: [1]},
  {id: 2, checkboxes: [{id: 30}, {id: 40}], valid_amount: [1,2]},
  {id: 3, checkboxes: [{id: 50}, {id: 60}, {id: 70}, {id: 80}], valid_amount: [1,2,3,4]},
];

const submittedCheckboxes = [
  {id: 10, value: true},
  {id: 20, value: true},
  {id: 30, value: true},
  {id: 40, value: true},
  {id: 50, value: true},
  {id: 60, value: false},
  {id: 70, value: true},
  {id: 80, value: false},
];
常数集=[ {id:1,复选框:[{id:10},{id:20}],有效金额:[1]}, {id:2,复选框:[{id:30},{id:40}],有效金额:[1,2]}, {id:3,复选框:[{id:50},{id:60},{id:70},{id:80}],有效金额:[1,2,3,4]}, ]; 提交的常数复选框=[ {id:10,value:true}, {id:20,value:true}, {id:30,value:true}, {id:40,value:true}, {id:50,value:true}, {id:60,值:false}, {id:70,value:true}, {id:80,值:false}, ]; console.logsets.mapvalid; 函数有效集{ 返回set.valid_amount.includeSet.checkbox.filtercheckbox=>SubmittedCheckBox.findset=>set.id==checkbox.id.value.length
} 我认为首先重新处理您的数据是有意义的:

设置

复选框不需要是对象列表,例如[id:1},{id:2}]。它可以是一个ID列表,例如[1,2] 我不确定列出所有可接受的金额有多大意义。只需指定每个金额的最大值即可 因此,转变:

{id: 2, checkboxes: [{id: 30}, {id: 40}], valid_amount: [1,2]},
进入:

这里有一个函数:

const transformSet = set => ({
  id: set.id,
  checkboxes: map(prop('id'), set.checkboxes),
  max_amount: last(set.valid_amount)
});
const transformCheckboxes = into([], compose(
  reject(propEq('value', false)),
  map(prop('id'))
));
复选框

如果我错了,您只关心值设置为true的对象,那么我似乎是对的。在这种情况下,我将删除那些值设置为false的,并只保留id

所以转变

[
  {id: 10, value: true},
  {id: 20, value: true},
  {id: 30, value: true},
  {id: 40, value: true},
  {id: 50, value: true},
  {id: 60, value: false},
  {id: 70, value: true},
  {id: 80, value: false},
]
进入:

这里有一个函数:

const transformSet = set => ({
  id: set.id,
  checkboxes: map(prop('id'), set.checkboxes),
  max_amount: last(set.valid_amount)
});
const transformCheckboxes = into([], compose(
  reject(propEq('value', false)),
  map(prop('id'))
));
为什么?

让我们以集合1为例,查找答案是否已提交就像查找两个数组的交集一样简单:

交叉口[10,20],[10,20,30,40,50,70] //=>[10,20]

然后,您需要确保数组的长度不大于该集合的最大值:

const selectCheckboxes = curry((checkboxes, set) =>
  pipe(intersection, length, gte(set.max_amount))
   (set.checkboxes, checkboxes));
现在,您可以对集合进行迭代,并返回SelectCheckBox不返回true的第一个集合。请注意选择复选框的用法:

const{curry,into,intersection,length,gte,map,prop,reject,last,useWith,find,compose,propEq,complete,pipe}=R; 常数集=[ {id:1,复选框:[{id:10},{id:20}],有效金额:[1]}, {id:2,复选框:[{id:30},{id:40}],有效金额:[1,2]}, {id:3,复选框:[{id:50},{id:60},{id:70},{id:80}],有效金额:[1,2,3,4]}, ]; 提交的常数复选框=[ {id:10,value:true}, {id:20,value:true}, {id:30,value:true}, {id:40,value:true}, {id:50,value:true}, {id:60,值:false}, {id:70,value:true}, {id:80,值:false}, ]; const transformSet=set=>{ id:set.id, 复选框:mapprop'id',set.checkbox, 最大金额:lastset.valid\u金额 }; 常量转换复选框=转换为[],组合 拒绝Q'value',false, 地图属性'id' ; const selectcheckbox=currycheckbox,set=> 管道交叉口、长度、gteset.max_数量 设置复选框,复选框; const findError=useWithfind[ 组件组件选择复选框、转换复选框、, 映射集]; console.log FinderRor提交的复选框、集合 ;
const findError = useWith(find, [
  compose(complement(selectCheckboxes), transformCheckboxes),
  map(transformSet)]);