1

下面是我的对象数组

[
{ field: 'EXPECTEDDATE', operator: 'gte', value: '20200601' },
{ field: 'EXPECTEDDATE', operator: 'lte', value: '20200630' },
{ field: 'PYNAME', operator: 'contains', value: 'abc' },
{ field: 'DEPT', operator: 'eq', value: 'IT' }
]

我想更改它的格式以将其传递给如下 API

{
attibuteName: 'PYNAME',
filterOperator1: 'contains',
filterValue1: 'abc',
filterOperator2: '',
filterValue2: '',
},
{
attibuteName: 'DEPT',
filterOperator1: 'eq',
filterValue1: 'IT',
filterOperator2: '',
filterValue2: '',
},
 {
attibuteName: 'EXPECTEDDATE',
filterOperator1: 'gte',
filterValue1: '20200601',
filterOperator2: 'lte',
filterValue2: '20200630',
}

下面是我当前的代码,我坚持将 filterOperator2 和 filterValue2 合并到 forEach 循环中同一字段的同一对象。

filtersArray.forEach((element, index, array) => {
   filterObject = gridColumns.find(currField => currField.attributeName === element.field);
   const filop1 = 'filterOperator1';
   const filval1 = 'filterValue1';
   const filop2 = 'filterOperator2';
   const filval2 = 'filterValue2';
   filterObject[filop1] = element.operator;      
   filterObject[filval1] = element.value;
   columnList.push(filterObject);
});
return columnList;
}

请建议我该怎么做。谢谢。

4

2 回答 2

1

我认为你可以这样做:

var arr= [
{ field: 'EXPECTEDDATE', operator: 'gte', value: '20200601' },
{ field: 'EXPECTEDDATE', operator: 'lte', value: '20200630' },
{ field: 'PYNAME', operator: 'contains', value: 'abc' },
{ field: 'DEPT', operator: 'eq', value: 'IT' }
]

var res = arr.reduce((acc, {field, operator, value})=>{
  if(acc[field]){
    if(!acc[field].filterValue2){
      acc[field].filterValue2= value
    }
    if(!acc[field].filterOperator2){
      acc[field].filterOperator2= operator
    }
 }else{
  acc[field] =  {
    attibuteName: field,
    filterOperator1:operator,
    filterValue1: value,
    filterOperator2: '',
    filterValue2: '',
  };

 }
return acc
}, {})

console.log(Object.values(res))

于 2020-06-29T06:42:29.767 回答
1

你可以用.reduce(). 这个解决方案是相当硬编码的,不是很动态

let arr = [
{ field: 'EXPECTEDDATE', operator: 'gte', value: '20200601' },
{ field: 'EXPECTEDDATE', operator: 'lte', value: '20200630' },
{ field: 'PYNAME', operator: 'contains', value: 'abc' },
{ field: 'DEPT', operator: 'eq', value: 'IT' }
]

let result = arr.reduce((a,v) => {
   let index = a.findIndex(el => el.attibuteName === v.field);
   if(index !== -1){
      a[index].filterOperator2 = v.operator;
      a[index].filterValue2 = v.value;
      return a;
   }
   a.push({
      attibuteName: v.field,
      filterOperator1: v.operator,
      filterValue1: v.value,
      filterOperator2: "",
      filterValue2: ""
   })
   return a;
},[])

console.log(result);

于 2020-06-29T06:35:37.090 回答