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

问题描述 投票:0回答:2

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

对于每个集合,检查submittedCheckboxes是否在其中并将它们隔离到新数组,以便我可以知道是否未超过设置为valid_amounttrue复选框数量。

在下面的示例中,它应该抛出表示集合#1的id的错误,因为submittedCheckboxes中的两个具有value: true,其中集合指定valid_amount: [1],但是设置#2应该没有,因为valid_amount选项是1或2,(valid_amount: [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},
];
javascript arrays object ramda.js
2个回答
1
投票

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},
];
console.log(sets.map(valid));

function valid(set) {
	return set.valid_amount.includes(set.checkboxes.filter(checkbox => submittedCheckboxes.find(set=>set.id === checkbox.id).value).length)
}

0
投票

我认为首先重新处理您的数据是有意义的:

  1. checkboxes不需要是一个对象列表(例如[{id:1},{id:2}])。它可以只是一个id列表(例如[1,2]
  2. 我不确定列出所有接受的金额有多大意义。只需指定每个金额可以拥有的最大值

变换:

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

成:

{id: 2, checkboxes: [30, 40], max_amount: 2}

这是一个功能:

const transformSet = set => ({
  id: set.id,
  checkboxes: map(prop('id'), set.checkboxes),
  max_amount: last(set.valid_amount)
});

复选框

似乎(纠正我,如果我错了)你只关心value被设置为true的对象。在这种情况下,我会删除value设置为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},
]

成:

[10, 20, 30, 40, 50, 70]

这是一个功能:

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));

现在你可以遍历你的集合并返回qazxsw poi没有返回true的第一个集合。 (注意使用qazxsw poi:

selectCheckboxes

complement(selectCheckboxes)
const findError = useWith(find, [
  compose(complement(selectCheckboxes), transformCheckboxes),
  map(transformSet)]);
© www.soinside.com 2019 - 2024. All rights reserved.