West Ham stunned Arsenal to record a third successive Premier League victory, denting the Gunners' title challenge in the process.
It was a ruthless display by West Ham, who converted two of their three shots on target, while Arsenal squandered a host of opportunities as they missed the chance to move top of the league.
Tomas Soucek fired in Jarrod Bowen's cutback and, while the ball had potentially gone out of play in the build-up, there was not enough evidence for the video assistant referee to overturn the goal.
That gave West Ham a first-half lead which was doubled when former Arsenal centre-back Konstantinos Mavropanos expertly headed in a corner in the 55th minute.
Despite plenty of possession and pressure, Arsenal could not find a response.
And their woeful night was nearly made worse when Declan Rice gave away a penalty in the final minute of injury time, but Said Benrahma's effort was saved by David Raya.
The result leaves Mikel Arteta's Gunners second in the table, two points behind league leaders Liverpool, while West Ham end the year with 33 points - their highest total at the halfway stage in a Premier League campaign.
Missed opportunity for Gunners
Arsenal's undoing was their inability to convert dominance and possession into goals.
As the match wore on, their failure to capitalise only led to frustration - not only on the pitch but also in the stands, as fans grew weary and the atmosphere drained at Emirates Stadium.
Opportunities were spurned as Bukayo Saka struck the post in the first half, Gabriel Martinelli fired wide and Gabriel Jesus headed high.
Ex-West Ham captain Rice later fizzed an effort over the bar, before Hammers goalkeeper Alphonse Areola denied Leandro Trossard and Martin Odegaard.
It was a stark contrast to West Ham's fortunes and the visitors were able to brilliantly fend off countless attacks with selfless defending.
Arsenal's lack of ruthlessness could prove costly with five teams sitting within six points of each other at the top of the Premier League. There is little room for error.
Season's greetings for Hammers
West Ham's results in December have been a festive treat with Moyes' side backing up an impressive win over Manchester United with this stunning result at the Emirates.
It means they sit sixth in the table, well in the mix for European qualification, following four wins, one draw and one defeat in the league this month.
Despite losing England midfielder Rice in the summer, who lined up for Arsenal against his former club for the first time, West Ham have shown maturity and growth in the first part of the campaign and have been rewarded with their highest points tally.
But there will be an anxious wait to learn the extent of Lucas Paqueta's injury - the Brazilian midfielder had ice strapped to his left leg after being forced off in the 31st minute, having pulled up in the warm-up before being risked anyway.
Latest Stories
-
Trump picks Pam Bondi as attorney general after Matt Gaetz withdraws
16 mins -
Providing quality seeds to farmers is first step towards achieving food security in Ghana
26 mins -
‘Restoring forests or ravaging Ghana’s green heritage?’ – Coalition questions Akufo-Addo’s COP 29 claims
2 hours -
Give direct access to Global Health Fund – Civil Society calls allocations
3 hours -
Trudeau plays Santa with seasonal tax break
4 hours -
Prince Harry jokes in tattoo sketch for Invictus
4 hours -
Akufo-Addo commissions 200MW plant to boost economic growth
4 hours -
Smallholder farmers to make use of Ghana Commodity Exchange
4 hours -
I want to focus more on my education – Chidimma Adetshina quits pageantry
5 hours -
Priest replaced after Sabrina Carpenter shoots music video in his church
5 hours -
Duct-taped banana artwork sells for $6.2m in NYC
5 hours -
Arrest warrants issued for Netanyahu, Gallant and Hamas commander over alleged war crimes
5 hours -
Actors Jonathan Majors and Meagan Good are engaged
5 hours -
Expired rice saga: A ‘best before date’ can be extended – Food and Agriculture Engineer
5 hours -
Why I rejected Range Rover gift from a man – Tiwa Savage
5 hours