尝试根据返回值过滤对象数组

时间:2019-09-05 23:19:12

标签: javascript arrays reactjs typescript object

我有这个要过滤的TypeScript对象数组,

const test: any[] = [
  {agency: 'SOME AGENCY 1', id: '1', association: '2433982101'},
  {agency: 'SOME AGENCY 1', id: '2', association: '2433982101'},
  {agency: 'SOME AGENCY 1', id: '3', association: '1917874801'},
  {agency: 'SOME AGENCY 2', id: '4', association: '2433982101'},
  {agency: 'SOME AGENCY 2', id: '5', association: '2433982101'},
  {agency: 'SOME AGENCY 2', id: '6', association: '1917874801'},
  {agency: 'SOME AGENCY 2', id: '7', association: '1917874801'},
  {agency: 'SOME AGENCY 2', id: '8', association: '2102923701'},
  {agency: 'SOME AGENCY 3', id: '9', association: '2433982101'},
  {agency: 'SOME AGENCY 3', id: '10', association: '2433982101'},
  {agency: 'SOME AGENCY 3', id: '11', association: '1917852501'}
]

尝试使用下面的这些值从上面的数组中过滤数据,我正在使用onChange回调函数,

onChange = (agency: string) => (
    association: string[]
  ) => {

}
// I am getting these values in callback
// agency = 'SOME AGENCY 2'
// association = ['2433982101', '2102923701']

// OR in another case
// agency = 'SOME AGENCY 1'
// association = ['2433982101']

我正在尝试删除回调中特定代理商在关联数组中未返回的所有值。我试图通过做这样的事情来过滤数组,

onChange = (agency: string) => (
    association: string[]
  ) => {
      const filteredData = test.filter(t =>
        association.some(a => a === t.association && t.agency === agency)
      );
      console.log('Filtered Data: ', filteredData);
}

例如,在本例中为1,

// agency = 'SOME AGENCY 2'
// association = ['2433982101', '2102923701']

这是我在filteredData中得到的:

Filtered Data:
      [
        {agency: "SOME AGENCY 2", id: "4", association: "2433982101"},
        {agency: "SOME AGENCY 2", id: "5", association: "2433982101"},
        {agency: "SOME AGENCY 2", id: "8", association: "2102923701"}
      ]

所以这两个被淘汰了,这是正确的:

  {agency: 'SOME AGENCY 2', id: '6', association: '1917874801'},
  {agency: 'SOME AGENCY 2', id: '7', association: '1917874801'}

但是我期望这样的输出而不是我实际得到的输出。 在这里,对于给定的示例案例1,我只希望从“测试”数组中删除id =“ 6”和“ 7”的项目

[
  {agency: 'SOME AGENCY 1', id: '1', association: '2433982101'},
  {agency: 'SOME AGENCY 1', id: '2', association: '2433982101'},
  {agency: 'SOME AGENCY 1', id: '3', association: '1917874801'},
  {agency: 'SOME AGENCY 2', id: '4', association: '2433982101'},
  {agency: 'SOME AGENCY 2', id: '5', association: '2433982101'},
  {agency: 'SOME AGENCY 2', id: '8', association: '2102923701'},
  {agency: 'SOME AGENCY 3', id: '9', association: '2433982101'},
  {agency: 'SOME AGENCY 3', id: '10', association: '2433982101'},
  {agency: 'SOME AGENCY 3', id: '11', association: '1917852501'}
]

因此,在这里简单地说,我正在尝试从“测试”数组中删除任何未包含在特定代理商的关联数组字符串中的项目,同时将所有其他代理商和关联数据保持原样,但我不确定如何准确地得到这个。

我尝试搜索相同的问题,但找不到类似的内容。很抱歉,如果以前已经回答过此类问题,但是如果有人可以帮助我,那将是很好的。

将尝试获取可复制的演示链接并在需要时对其进行编辑,这样可以很容易地准确理解我在此处想要实现的目标。

可复制的演示链接: https://codesandbox.io/s/cool-resonance-drv0i

我在这里想要的是仅在表中显示所选复选框关联编号中的数据,因此,如果我从任何一个框中选择或取消选择,以前从其他框中选择/取消选择的数据都不会消失。

2 个答案:

答案 0 :(得分:1)

如果您只想按传递的-关联数组进行过滤,则应做到简单:

const test = [
  {agency: 'SOME AGENCY 1', id: '1', association: '2433982101'},
  {agency: 'SOME AGENCY 1', id: '2', association: '2433982101'},
  {agency: 'SOME AGENCY 1', id: '3', association: '1917874801'},
  {agency: 'SOME AGENCY 2', id: '4', association: '2433982101'},
  {agency: 'SOME AGENCY 2', id: '5', association: '2433982101'},
  {agency: 'SOME AGENCY 2', id: '6', association: '1917874801'},
  {agency: 'SOME AGENCY 2', id: '7', association: '1917874801'},
  {agency: 'SOME AGENCY 2', id: '8', association: '2102923701'},
  {agency: 'SOME AGENCY 3', id: '9', association: '2433982101'},
  {agency: 'SOME AGENCY 3', id: '10', association: '2433982101'},
  {agency: 'SOME AGENCY 3', id: '11', association: '1917852501'}
];

  onChange = (agency: string) => (association: string[]) => {
      const filteredData = test.filter(t => 
        (agency === t.agency) ? association.includes(t.association) : t
      );
      console.log('Filtered Data: ', filteredData);
};

onChange('SOME AGENCY 2')(['2433982101', '2102923701']);
  

[{agency:'SOME AGENCY 1',id:'1',association:'2433982101'},
  {agency:'SOME AGENCY 1',id:'2',association:'2433982101'},
  {agency:'SOME AGENCY 1',id:'3',association:'1917874801'},
  {agency:'SOME AGENCY 2',id:'4',association:'2433982101'},
  {agency:'SOME AGENCY 2',id:'5',association:'2433982101'},
  {agency:'SOME AGENCY 2',id:'8',association:'2102923701'},
  {agency:'SOME AGENCY 3',id:'9',association:'2433982101'},
  {agency:'SOME AGENCY 3',id:'10',association:'2433982101'},
  {agency:'SOME AGENCY 3',id:'11',association:'1917852501'}]

答案 1 :(得分:0)

要获得预期的过滤器行为,请删除t.agency === agency crtiera,以仅包括在指定的association列表中具有渐变的项目:

const onChange = (agency: string) => (association: string[]) => {

  const filteredData = test.filter(t => association.some(a => a === t.association));
  console.log('Filtered Data: ', filteredData);
}

onChange('SOME AGENCY 2')(['2433982101', '2102923701'])

这里有working example供您尝试

相关问题