Так как последние объекты в массиве - это те, которые вам нужны, вы можете использовать reduceRight()
и просто добавить к конечному результату совпадения, которых еще нет в конечном массиве, что-то вроде:
let matches = [
{ matchId: "271691", homeTeamScore: "1", awayTeamScore: "1" },
{ matchId: "271692", homeTeamScore: "1", awayTeamScore: "1" },
{ matchId: "271700", homeTeamScore: "1", awayTeamScore: "1" },
{ matchId: "271691", homeTeamScore: "6", awayTeamScore: "6" },
{ matchId: "271691", homeTeamScore: "8", awayTeamScore: "8" },
{ matchId: "271691", homeTeamScore: "8", awayTeamScore: "8" },
{ matchId: "271691", homeTeamScore: "8", awayTeamScore: "0" },
];
let result = matches.reduceRight(
(p, c) => (!p.find((o) => o.matchId === c.matchId) ? [...p, c] : p),
[]
);
console.log(result);
или более оптимизированный подход, сохраняющий последние matchIds на карте:
let matches = [
{ matchId: "271691", homeTeamScore: "1", awayTeamScore: "1" },
{ matchId: "271692", homeTeamScore: "1", awayTeamScore: "1" },
{ matchId: "271700", homeTeamScore: "1", awayTeamScore: "1" },
{ matchId: "271691", homeTeamScore: "6", awayTeamScore: "6" },
{ matchId: "271691", homeTeamScore: "8", awayTeamScore: "8" },
{ matchId: "271691", homeTeamScore: "8", awayTeamScore: "8" },
{ matchId: "271691", homeTeamScore: "8", awayTeamScore: "0" },
];
let matchIds = new Map();
let result = matches.reduceRight((p, c) => {
if (!matchIds.get(c.matchId)) {
matchIds.set(c.matchId, true);
return [...p, c];
}
return p;
}, []);
console.log(result);
В случае, если вы хотите заранее проверить, есть ли уже совпадения с определенным идентификатором, и отфильтровать их перед добавлением последнего, вы можете сделать что-то вроде:
let matches = [
{ matchId: "271691", homeTeamScore: "1", awayTeamScore: "1" },
{ matchId: "271692", homeTeamScore: "1", awayTeamScore: "1" },
{ matchId: "271700", homeTeamScore: "1", awayTeamScore: "1" },
];
let addMatch = (match) => {
matches = matches.filter(({
matchId
}) => matchId !== match.matchId);
return matches.push(match), matches;
};
let latest = { matchId: "271691", homeTeamScore: "6", awayTeamScore: "6" };
addMatch(latest); // Add the latest match, replace if there was already a score
console.log(matches);