Created
January 6, 2013 03:55
-
-
Save robinkraft/4465104 to your computer and use it in GitHub Desktop.
simple ordering implementation for foursquare hackathon dish ranking app - messy messy messy!
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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