function getTopTwoCandidates(raceData) { const candidates = raceData.reportingUnits[0].candidates // filter out not real candidates const filtered = candidates.filter(c => primaries2016Candidates.find(c2 => c2.last === c.last.toLowerCase())) // sort by votes, ballot order, active const withActive = filtered.map(c => { const cand = primaries2016Candidates.find(c2 => c2.last === c.last.toLowerCase()) c.active = cand.suspendedDate ? 0 : 1 return c }) const ordered = orderBy(withActive, ['voteCount', 'active', 'ballotOrder'], ['desc', 'desc', 'asc']) const totalVotes = Candidates.getVoteCount(candidates) // return top two with percents return ordered.map(candidate => { const { first, last, voteCount } = candidate const percent = `${toPercent(voteCount / totalVotes)}%` const isWinner = Candidate.isWinner(candidate) return { first, last, percent, isWinner } }).slice(0, 2) }
export default function stateResults({ race, show, prioritize }) { // get state-level reporting unit const stateUnit = race.reportingUnits.find(x => x.level === 'state') // augment candidate with 'isMainAndRunning' boolean flag const candidates = stateUnit.candidates.map(candidate => { // try to find this candidate in primaries2016Candidates const mainCandidate = primaries2016Candidates.find(c => compareStringsIgnoreCase(c.last, candidate.last)) const isMainAndRunning = !!mainCandidate && !mainCandidate.suspendedDate return { ...candidate, isMainAndRunning } }) // sort candidates const sortedCandidates = orderBy(candidates, ['isMainAndRunning', 'voteCount', 'ballotOrder'], ['desc', 'desc', 'asc'] ) // get the total vote count const totalVoteCount = Candidates.getVoteCount(sortedCandidates) const party = standardize.expandParty(race.party) const stateAbbr = stateUnit.statePostal const state = standardize.expandState(stateAbbr) const raceType = standardize.raceType(race.raceType) const raceInfo = primaries2016Dates.find(d => { const sameState = compareStringsIgnoreCase(d.stateAbbr, stateAbbr) const sameParty = compareStringsIgnoreCase(d.party, party) return sameState && sameParty }) const note = raceInfo.resultsNote ? `<div class="results-note">Note: ${raceInfo.resultsNote}</div>` : '' return ` <div class='title-and-updater ${party}'> <div class='title'><span class='iota'>${party} ${raceType}</span></div> </div> <div class='results ${party}'> ${sortedCandidates.slice(0, show).map((candidate, index) => candidateRow({ candidate, index, totalVoteCount, party, prioritize })).join('')} </div> ${note} <div class='precincts-and-more'> <div class='precincts'><span class='iota'>${+stateUnit.precinctsReportingPct}% <span class='extra'>precincts</span> reporting</span></div> </div> ` }