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 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.
Reaction to Thursday's Premier League actionMissed opportunity for Gunners
Declan Rice left West Ham for a fee rising to £105m in the summer to join ArsenalArsenal'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.
How to play
Rate players out of 10 throughout or after the game. The rater will close 30 minutes after the final whistle.
Rating range key1 = Give it up10 = Pure perfection
Arsenal
Squad number22Player nameRaya
Squad number4Player nameWhite
Squad number2Player nameSaliba
Squad number6Player nameGabriel Magalhães
Squad number35Player nameZinchenko
Squad number8Player nameØdegaard
Squad number41Player nameRice
Squad number19Player nameTrossard
Squad number7Player nameSaka
Squad number9Player nameGabriel Jesus
Squad number11Player nameGabriel Martinelli
Squad number10Player nameSmith Rowe
Squad number14Player nameNketiah
Squad number24Player nameNelson
West Ham United
Squad number23Player nameAreola
Squad number5Player nameCoufal
Squad number15Player nameMavropanos
Squad number21Player nameOgbonna
Squad number33Player nameEmerson
Squad number19Player nameÁlvarez
Squad number28Player nameSoucek
Squad number14Player nameKudus
Squad number7Player nameWard-Prowse
Squad number10Player nameLucas Paquetá
Squad number20Player nameBowen
Squad number22Player nameBenrahma
Line-ups
Arsenal
Formation 4-3-3
22Raya4White2Saliba6Gabriel35ZinchenkoSubstituted forNelsonat 64'minutesBooked at 72mins8Ødegaard41Rice19TrossardSubstituted forSmith Roweat 79'minutes7Saka9Gabriel JesusBooked at 90mins11MartinelliSubstituted forNketiahat 64'minutesSubstitutes
1Ramsdale10Smith Rowe14Nketiah15Kiwior17Cédric Soares20Jorginho24Nelson25Elneny63NwaneriWest Ham
Formation 4-2-3-1
23Areola5Coufal15Mavropanos21Ogbonna33Emerson19Álvarez28Soucek14Kudus7Ward-Prowse10Lucas PaquetáSubstituted forBenrahmaat 33'minutes20BowenSubstitutes
1Fabianski2Johnson3Cresswell8Fornals17Cornet18Ings22Benrahma24Kehrer45MubamaReferee:Michael Oliver
Attendance:60,261
Live Text
Match ends, Arsenal 0, West Ham United 2.
Second Half ends, Arsenal 0, West Ham United 2.
Penalty saved. Saïd Benrahma (West Ham United) right footed shot saved in the bottom right corner.
Penalty conceded by Declan Rice (Arsenal) after a foul in the penalty area.
Penalty West Ham United. Emerson draws a foul in the penalty area.
Attempt blocked. Eddie Nketiah (Arsenal) right footed shot from the centre of the box is blocked. Assisted by Bukayo Saka.
Corner, Arsenal. Conceded by James Ward-Prowse.
Attempt blocked. William Saliba (Arsenal) header from the right side of the six yard box is blocked. Assisted by Martin Ødegaard with a cross.
Corner, Arsenal. Conceded by Emerson.
Attempt blocked. Bukayo Saka (Arsenal) left footed shot from the centre of the box is blocked.
Gabriel Jesus (Arsenal) is shown the yellow card.
Attempt missed. Reiss Nelson (Arsenal) left footed shot from outside the box is high and wide to the left following a corner.
Corner, Arsenal. Conceded by Alphonse Areola.
Attempt saved. Martin Ødegaard (Arsenal) left footed shot from outside the box is saved in the bottom right corner. Assisted by Bukayo Saka.
Gabriel Magalhães (Arsenal) wins a free kick on the left wing.
Foul by Jarrod Bowen (West Ham United).
Attempt saved. Eddie Nketiah (Arsenal) right footed shot from the centre of the box is saved in the centre of the goal.
Corner, Arsenal. Conceded by Edson Álvarez.
Gabriel Magalhães (Arsenal) wins a free kick in the defensive half.
Foul by Mohammed Kudus (West Ham United).