Skip to content

Instantly share code, notes, and snippets.

@robinkraft
Created January 6, 2013 03:55
Show Gist options
  • Select an option

  • Save robinkraft/4465104 to your computer and use it in GitHub Desktop.

Select an option

Save robinkraft/4465104 to your computer and use it in GitHub Desktop.
simple ordering implementation for foursquare hackathon dish ranking app - messy messy messy!
var B = {};
var REC = { "_id" : "HZXXY3", "venues" : { "A" : [ "B" ], "B" : [ "C" ], "C" : [ ] } };
var RECS = [rec];
TESTJSON = [{ "_id" : "HZXXY3", "venues" : { "A" : [ "B" ], "B" : [ "C" ], "C" : [ ] } }, { "_id" : "HZXXY4", "venues" : { "A" : [ "B" ], "B" : [ "C" ], "C" : [ ] } }, { "_id" : "HZXXY5", "venues" : { "A" : [ "B", "C"], "B" : [ "A", "C" ], "C" : ["A"] } }];
function increment_venue_ballot(v, k, ballot) {
if (typeof(ballot[v]) == "undefined") {
ballot[v] = {"for": 0, "against": 0}; // initialize ballot with 0s
}
++ballot[v][k]; // increment for or against, depending on value of k
return ballot;
}
// increment_venue_ballot("a","for", {})
// { a: { for: 1, against: 0 } }
function parse_venue(rec, ballot) {
for (var winner in rec.venues) {
// increment for vote for winner
if (rec.venues[winner].length > 0) {
ballot = increment_venue_ballot(winner, "for", ballot);
}
// increment against votes for losers
for (var loser_idx in rec.venues[winner]) {
var loser = rec.venues[winner][loser_idx];
ballot = increment_venue_ballot(loser, "against", ballot);
}
}
return ballot;
}
function parse_records(recs) {
var ballot = {};
for (var i in recs) { // parse all records
ballot = parse_venue(recs[i], ballot);
}
return ballot;
}
// parse_records(RECS)
// { A: { for: 1, against: 0 }, B: { for: 1, against: 1 }, C: { for: 0, against: 1 } }
function get_margin(votes) {
return votes["for"] - votes["against"]; // calculate vote margin
}
// get_margin({"for":1, "against":2})
// => -1
function get_venue_tallies(ballot) {
var tally = [];
for (var venue in ballot) {
var against = ballot[venue].against; // votes against
var votes = ballot[venue]; // votes
var margin = get_margin(votes); // vote margin
// store stats in dictionary
tally.push({"venue":venue,
"margin":margin,
"against":against});
}
return tally;
}
/*
get_venue_tallies(parse_records(RECS))
[ { venue: 'A', margin: 1, against: 0 },
{ venue: 'B', margin: 0, against: 1 },
{ venue: 'C', margin: -1, against: 1 } ]
*/
function mysortfunction(a, b) {
// sorting on two fields!
var margin1 = a.margin;
var margin2 = b.margin;
var against1 = a.against;
var against2 = b.against;
if (margin1 != margin2) {
if (margin1 < margin2) return -1;
if (margin1 > margin2) return 1;
return 0;
}
if (against1 < against2) return 1;
if (against1 > against2) return -1;
return 0;
}
function rank_venues(tallies) {
// sort venues by votes, descending in awesomeness
return tallies.sort(mysortfunction).reverse();
}
function main (){
var records = TESTJSON;
var ballot = parse_records(records);
tallies = get_venue_tallies(ballot);
ranks = rank_venues(tallies);
return ranks;
}
/*
main()
[ { venue: 'A', margin: 1, against: 2 },
{ venue: 'B', margin: 0, against: 3 },
{ venue: 'C', margin: -3, against: 4 } ]
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment