【问题标题】:Return matching item from within nested array of objects从嵌套的对象数组中返回匹配项
【发布时间】:2020-02-06 16:54:48
【问题描述】:

我有一组按 scheduleOn 数据分组的数组,如下所示

[{
scheduledOn: "2020-02-05T00:00:00"
matches:
{id: 1, homeTeamName: "BLUE", homeTeamId: 1, homeScore: 1, awayTeamName: "Red", awayTeamId: 2, …}
{id: 2,homeTeamName: "Red", homeTeamId: 2, homeScore: 1, awayTeamName: "Yellow", awayTeamId: 3, …}
},
{
scheduledOn: "2020-01-06T00:00:00"
matches:
0: {id:3, homeTeamName: "BLUE", homeTeamId: 1, homeScore: 0, awayTeamName: "Yellow", awayTeamId: 3, …}
}]

我想返回一个与所选 id 匹配的匹配对象(不是数组)

我尝试过的可能解决方案 1:

matches.map(match => match.matches
              .find(m => m.id === selectedId))

返回:

 [{

    id: 1, homeTeamName: "BLUE", homeTeamId: 1, homeScore: 1, awayTeamName: "Red", awayTeamId: 2, …
    }]

但我希望这只是一个对象而不是数组。

我尝试过的可能解决方案 2:

matches.map(match => match.matches
              .filter(m => m.id === selectedId))
              .map(match => console.log(match

)

返回:

 [
    {id: 1, homeTeamName: "BLUE", homeTeamId: 1, homeScore: 1, awayTeamName: "Red", awayTeamId: 2, …}
    ]

但这也作为数组返回。

有没有办法匹配 id 对象而不是数组?

感谢大家的帮助

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    你使用了两次find()

    const matches = [{
    scheduledOn: "2020-02-05T00:00:00",
    matches:[
    {id: 1, homeTeamName: "BLUE", homeTeamId: 1, homeScore: 1, awayTeamName: "Red", awayTeamId: 2 },
    {id: 2,homeTeamName: "Red", homeTeamId: 2, homeScore: 1, awayTeamName: "Yellow", awayTeamId: 3 }]
    },
    {
    scheduledOn: "2020-01-06T00:00:00",
    matches:[{id:3, homeTeamName: "BLUE", homeTeamId: 1, homeScore: 0, awayTeamName: "Yellow", awayTeamId: 3 }]
    }];
    
    
    const selectedId =  3;
    const required = matches.find(match => 
                      match.matches.find(m => m.id === selectedId));
    console.log(required);
    
       // if you wanted nested object, add another `.find()`
       console.log(required .matches.find(m => m.id === selectedId));

    【讨论】:

    • 它返回 {scheduledOn: "2020-02-05T00:00:00", 匹配: Array(2)} scheduleOn: "2020-02-05T00:00:00" 匹配: 0: { homeTeamName: "BLUE", homeTeamId: 1, homeScore: 1, awayTeamName: "Red", awayTeamId: 2, ...} 1: {homeTeamName: "Red", homeTeamId: 2, homeScore: 1, awayTeamName:
    • 我只想要匹配数据
    • 这是您在第一版问题中提出的问题
    • 我想我没有提出正确的问题。有没有办法只能找到一个匹配对象?
    • @JakeKwon 我添加了你想要的。查看更新的答案
    【解决方案2】:

    您可以使用 flatMap() 将所有 matches 属性展平为单个数组并搜索:

    const src = [{"scheduledOn":"2020-02-05T00:00:00","matches":[{"id":1,"homeTeamName":"BLUE","homeTeamId":1,"homeScore":1,"awayTeamName":"Red","awayTeamId":2},{"id":2,"homeTeamName":"Red","homeTeamId":2,"homeScore":1,"awayTeamName":"Yellow","awayTeamId":3}]},{"scheduledOn":"2020-01-06T00:00:00","matches":[{"id":3,"homeTeamName":"BLUE","homeTeamId":1,"homeScore":0,"awayTeamName":"Yellow","awayTeamId":3}]}],
          itemWithId2 = src.flatMap(({matches}) => matches).find(({id}) => id==2)
          
    console.log(itemWithId2)      

    不过,您应该记住,它在 Microsoft 浏览器中是 may fail(就像许多其他很酷的东西一样)(至少在 IE 消失之前)。

    如果是这种情况,您可以使用arr.reduce((r,{matches}) => r.concat(matches), []) 而不是flatMap()

    不过,在处理大型数组时,@Zohaibljaz 建议的嵌套查找将是 more performant

    我的实现会是不可接受的不可读

    const src = [{"scheduledOn":"2020-02-05T00:00:00","matches":[{"id":1,"homeTeamName":"BLUE","homeTeamId":1,"homeScore":1,"awayTeamName":"Red","awayTeamId":2},{"id":2,"homeTeamName":"Red","homeTeamId":2,"homeScore":1,"awayTeamName":"Yellow","awayTeamId":3}]},{"scheduledOn":"2020-01-06T00:00:00","matches":[{"id":3,"homeTeamName":"BLUE","homeTeamId":1,"homeScore":0,"awayTeamName":"Yellow","awayTeamId":3}]}]
    
    let objectHavingIdOf2 = {}
    
    src.find(({matches}) => 
      matches.find(item => 
        item.id == 2 ? 
        (objectHavingIdOf2 = item, true) :
        false))
        
    console.log(objectHavingIdOf2)    

    【讨论】:

    • 不客气。如果性能确实对处理大型数组很重要,请查看我的答案的扩展版本。
    【解决方案3】:

    这里有一个简单的递归函数可以帮助您:

    function findById(arr, id) {
        return arr.find(a => {
            if (a.matches && a.matches.length > 0) {
                return a.id === id ? true : findById(a.matches, id)
            } else {
                return a.id === id
            }
        })
    }
    
    // call this method with your data
    findById(data, 1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-17
      • 2013-11-28
      • 1970-01-01
      • 2022-01-26
      • 2021-02-20
      • 1970-01-01
      • 2022-01-25
      相关资源
      最近更新 更多