我有如下按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对象而不是数组?
感谢您的所有帮助
答案 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)