从对象的嵌套数组中返回匹配项

时间:2020-02-06 16:54:48

标签: javascript reactjs

我有如下按Scheduled数据分组的数组

[{
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对象而不是数组?

感谢您的所有帮助

3 个答案:

答案 0 :(得分:2)

您两次使用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));

答案 1 :(得分:1)

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

matches

但是,请记住,它may fail(就像许多其他很棒的东西一样)在Microsoft浏览器中(至少在IE消失之前)。

在这种情况下,您可以使用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) 代替arr.reduce((r,{matches}) => r.concat(matches), [])

但是,当处理大型数组时,@ Zohaibljaz建议的嵌套发现将是more performant

我对此的实现将是无法接受的

flatMap()

答案 2 :(得分:0)

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

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)