【问题标题】:typescript how to find inside an array that is already in an array?打字稿如何在已经在数组中的数组中查找?
【发布时间】:2020-07-29 03:01:22
【问题描述】:

我想在数组中找到一个已经在数组中的值。

举一个我的数组的例子:

[
    {
        ConcessionId: 1,
        ConcessionName: "Coyotes",
        KnownAs: [
          {
            TeamId: 1,
            Name: "Arizona Coyotes",
          },
          {
            TeamId: 2,
            Name: "Phoenix Coyotes",
          }
        ]
    },
    {
        ConcessionId: 2,
        ConcessionName: "Devils",
        KnownAs: [
          {
            TeamId: 3,
            Name: "Colorado Rockies",
          },
          {
            TeamId: 4,
            Name: "New-Jersey Devils",
          }
        ]
    }
]

我想要的是当我调用我的函数时,它会返回团队名称。 比如我的参数值是3,我想要Colorado Rockies作为名字:

public getInfo(_TeamID) { 
    const concession: ConcessionInfo[] =  this.concessionList$.filter(function (x) {
      x.KnownAs.filter( (y)=> {
          y.TeamId= +_TeamID;
          return y.Name;
      })
    })

}

我尝试了很多不同的过滤方式。但永远得不到好东西。从不工作。

我可以为每个数组制作一个双 .foreach 。但我认为存在比双循环更好的方法。

谢谢

【问题讨论】:

    标签: arrays typescript filter find


    【解决方案1】:

    您可以在两个数组上执行 forEach,而不是使用 filter 方法(实际上它的工作原理类似于 for 循环)。对于您当前的数据结构,没有其他方法可以解决它。

    getInfo = (_TeamID) => {
      let teamName = '';
      this.concessionList$.forEach(entry => {
        entry.KnownAs.forEach(team => {
          if(team.TeamId === _TeamID){
            teamName = team.Name;
            return; // break the loop.
          }
        })
      });
      return teamName;
    }
    

    这是一个工作示例

    https://stackblitz.com/edit/double-for-lopp

    编辑 如果您查看来自 Mozilla https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter 的 filter 的 polyfill 实现,它等效于 filter 的本机实现,您可以看到它正在循环整个数组,与 forEach 循环的方式相同。不同的是 filter 方法会根据回调函数内部的布尔条件返回一个新数组,而 forEach 循环不返回任何内容。

    【讨论】:

    • 是的,就像我一样,我需要使用双循环。它工作得很好。谢谢。
    【解决方案2】:

    假设myArray 包含您提供的数据。

    如果您使用的是 Typescript 3.7 及更高版本,则以下代码将起作用。

    public getInfo(teamId: number): string | undefined {
        const team = this.concessionList$
          .map(concession => concession.KnownAs)
          .reduce((a, b) => a.concat(b), [])
          .find(team => team.TeamId === teamId)
        return team ? team.Name : undefined
    }
    

    用法:

    this.getInfo(3) // Colorado Rockies
    

    好的,这是如何工作的?

    您必须了解find 是什么。例如:

    const result = [{name: 'foo', age: 1}, {name: 'bar', age: 2}]
        .find(people => people.name === 'foo')
    
    
    console.log(result) // {name: 'foo', age: 1}
    

    【讨论】:

    • 伙计,您的解决方案正是我正在寻找的。不幸的是,即使我添加了 mergemap 的导入,平面图也无法正常工作。我也尝试用地图替换它。但是在另一个错误说之后,team.TeamId 无法识别。很遗憾你的解决方案对我不起作用。
    • @baronming 我已将解决方案更新为可能与您的 Javascript 版本兼容的内容,您想试试吗?
    猜你喜欢
    • 2020-12-04
    • 1970-01-01
    • 2021-04-03
    • 2017-08-10
    • 2018-06-18
    • 1970-01-01
    • 2020-03-26
    • 2022-10-12
    • 2013-04-20
    相关资源
    最近更新 更多