繁体   English   中英

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

[英]Trying to filter array of object based on returned values

我有这个我要过滤的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']

这是我在过滤数据中得到的:

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,我只希望从'test'数组中删除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'}
]

所以简单地说,我试图删除'test'数组中的任何项目,这些项目不包含在特定机构的关联数组字符串中,同时保留所有其他代理和关联数据,但我不确定如何准确得到这个。

我试着搜索同样的问题,但我找不到类似的东西。 我很抱歉,如果此类问题之前已经得到解答,但是如果有人能帮助我那会很棒。

将尝试获得可重现的演示链接并在需要时进行编辑,以便很容易理解我在这里想要实现的目标。

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

我想要的只是从选定的复选框关联号码中显示表中的数据,因此如果我从任何一个框中选择或取消选择,则其他框中先前选择/取消选择的数据不应消失。

如果你只想通过传入的关联数组进行过滤,你应该这样做:

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'},
{代理:'SOME AGENCY 3',id:'10',协会:'2433982101'},
{代理:'SOME AGENCY 3',id:'11',协会:'1917852501'}]

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

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'])

这是一个可以尝试的工作示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM