diff --git a/src/ui/Wines.vue b/src/ui/Wines.vue index 407af89..51d7b02 100644 --- a/src/ui/Wines.vue +++ b/src/ui/Wines.vue @@ -36,7 +36,18 @@ export default { response.sort(); response = response .filter(wine => wine.name != null && wine.name != "") - .sort((a, b) => (a.rating > b.rating ? -1 : 1)); + .sort( + this.predicate( + { + name: "occurences", + reverse: true + }, + { + name: "rating", + reverse: true + } + ) + ); this.wines = response.slice(0, 5); }, methods: { @@ -49,6 +60,67 @@ export default { eventAction: "click", eventValue: `${wine.name} - ${wine.vivinoLink}` }); + }, + + predicate: function() { + var fields = [], + n_fields = arguments.length, + field, + name, + cmp; + + var default_cmp = function(a, b) { + if (a == undefined) a = 0; + if (b == undefined) b = 0; + if (a === b) return 0; + return a < b ? -1 : 1; + }, + getCmpFunc = function(primer, reverse) { + var dfc = default_cmp, + // closer in scope + cmp = default_cmp; + if (primer) { + cmp = function(a, b) { + return dfc(primer(a), primer(b)); + }; + } + if (reverse) { + return function(a, b) { + return -1 * cmp(a, b); + }; + } + return cmp; + }; + + // preprocess sorting options + for (var i = 0; i < n_fields; i++) { + field = arguments[i]; + if (typeof field === "string") { + name = field; + cmp = default_cmp; + } else { + name = field.name; + cmp = getCmpFunc(field.primer, field.reverse); + } + fields.push({ + name: name, + cmp: cmp + }); + } + + // final comparison function + return function(A, B) { + var name, result; + for (var i = 0; i < n_fields; i++) { + result = 0; + field = fields[i]; + name = field.name; + + result = field.cmp(A[name], B[name]); + if (result !== 0) break; + } + return result; + }; } } };