typescript 如何根据数组中的元素从对象数组中过滤出一个对象?

vlf7wbxs  于 2023-01-14  发布在  TypeScript
关注(0)|答案(2)|浏览(329)

我正在做一个multiple selection有两个下拉菜单的项目,如果我在第一个下拉菜单中选择了squirtle,那么第二个下拉菜单中的选项就会被禁用,但这并不是预期的输出:
1.当有人从第一个下拉列表中选择一个选项时,整个选项组都应该从第二个下拉列表中禁用/启用(仅第二个下拉列表)。例如,如果我从第一个下拉列表中的Water组中选择Squirtle,则整个Water组都应该在第二个下拉列表中禁用/启用
1.多选应该只适用于某个组。例如,如果我从第一个下拉列表中的Water组中选择Squirtle,我应该只能从第一个下拉列表中的Water组中选择另一个选项(在第二个下拉列表中没有这样的限制,因为在第一个下拉列表中选择的组在第二个下拉列表中被完全禁用(或删除)),如果我尝试从另一个组中选择,两个下拉列表都应该重置。
下面是JSON:

items = [
    {
      type: 'all',
      name: ['All Pokemon'],
    },
    {
      type: 'water',
      name: [
        'Squirtle',
        'Wartortle',
        'Blastoise',
        'Psyduck',
        'Golduck',
        'Tentacool',
        'Seel',
      ],
    },
    {
      type: 'fire',
      name: [
        'Charmander',
        'Charizard',
        'Vulpix',
        'Arcanine',
        'Ponyta',
        'Magmar',
        'Cyndaquil',
      ],
    },
    {
      type: 'earth',
      name: ['Growlithe', 'Arcanine', 'Geodude', 'Golem', 'Onix'],
    },
  ];

我创建了两个数组:

this.arr1 = this.items;
this.arr2 = this.items.filter((x) => x.type !== 'all');

现在,当用户从第一个下拉列表(arr1)中选择一个选项时,我将尝试使用以下逻辑根据第一个下拉列表中选择的选项从(arr2)中过滤掉整个对象:

this.arr2.filter((x) => {
   console.log(x.name);
   const data = [];
   !includeTest.find((y) => {
        console.log('y ->', y);
        if (x.name.includes(y)) {
          data.push(y);
          console.log('data ->', data);
        }
      });
      x.name = data;
      console.log('x.name', x.name);
    });

这里,includeTest包含一个字符串数组,我必须根据这个数组过滤掉另一个数组中的对象。这是problem的stackblitz表示:

dojqjjoe

dojqjjoe1#

试着阅读关于角管,特别是关于“过滤器”。有很多的资源在这里,也在文件的Angular 。
简单地说,所有的'ngFor'或'ng-repeat'都必须通过过滤管道过滤。当您从下拉列表1中选择某项时,过滤器在下拉列表2中,填充显示基于下拉列表1值过滤的数据,反之亦然。

if (dropdown1.type == 'water') {dropdown2.items = ...}

if (dropdown1.type == 'water' && dropdown1.name == 'Vulpix') {dropdown2.items = ...}

<li *ngFor="let item of dropdown2 | callback: filterData">...</li>

filterData(item: Item) {
    if (dropdown1.type == 'water' && item == 'your rules') {return item}
}

因此下拉列表2的数据将总是基于下拉列表1

3pvhb19x

3pvhb19x2#

我能够实现我的第一个问题。我使用.forEach()而不是.map(),并使用.includes()检查所选选项是否在对象中。stackblitz表示它。
但仍然无法解决第二个问题

相关问题