Code:function transform(input) {
var CITIES = {
'nyc': {lat:40.7772,lon:-73.8726,name:'NYC'},
'new york': {lat:40.7772,lon:-73.8726,name:'NYC'},
'atlanta': {lat:33.6407,lon:-84.4277,name:'Atlanta'},
'miami': {lat:25.7959,lon:-80.2870,name:'Miami'},
'chicago': {lat:41.9742,lon:-87.9073,name:'Chicago'},
'dallas': {lat:32.8471,lon:-96.8518,name:'Dallas'},
'tokyo': {lat:35.5494,lon:139.7798,name:'Tokyo'},
'hong kong': {lat:22.3022,lon:114.1742,name:'HongKong'},
'hongkong': {lat:22.3022,lon:114.1742,name:'HongKong'},
'singapore': {lat:1.3502,lon:103.9940,name:'Singapore'},
'seoul': {lat:37.4691,lon:126.4505,name:'Seoul'},
'london': {lat:51.5048,lon:0.0495,name:'London'},
'paris': {lat:48.9694,lon:2.4414,name:'Paris'}
};
var US = ['NYC','Atlanta','Miami','Chicago','Dallas'];
var WIN_MIN=18, WIN_MAX=30;
var now = new Date();
var groups = {};
for (var i=0; i<(input.markets||[]).length; i++) {
var m = input.markets[i];
if (!m.active || m.closed) continue;
var q = (m.question||'').toLowerCase();
var city = null;
var keys = Object.keys(CITIES);
for (var j=0; j<keys.length; j++) {
if (q.indexOf(keys[j]) >= 0) { city = CITIES[keys[j]]; break; }
}
if (!city) continue;
var end = new Date(m.endDate);
var hrs = (end - now) / 3600000;
if (hrs < WIN_MIN || hrs > WIN_MAX) continue;
var dateStr = m.endDate.split('T')[0];
var gk = city.name + '_' + dateStr;
if (!groups[gk]) {
var d = new Date(end); d.setUTCHours(0,0,0,0);
groups[gk] = {city:city.name, lat:city.lat, lon:city.lon, targetDate:d.toISOString().split('T')[0], isUS:US.indexOf(city.name)>=0, bins:[]};
}
var question = m.question||'';
var price = parseFloat((m.outcomePrices||[])[0]||'0');
var tid = (m.tokenIds||[])[0]||'';
if (!tid) continue;
var lo, hi;
var rangeMatch = question.match(/(\\d+)\\s*[-\\u2013]\\s*(\\d+)/);
if (rangeMatch) {
lo = parseFloat(rangeMatch[1]); hi = parseFloat(rangeMatch[2]);
} else {
var singleMatch = question.match(/be\\s+(\\d+)[\\u00b0]/);
if (singleMatch) { lo = parseFloat(singleMatch[1]); hi = lo; }
else if (question.match(/or below/i)) {
var bm = question.match(/(\\d+)[\\u00b0]/); if(bm){lo=parseFloat(bm[1])-1;hi=parseFloat(bm[1]);}
} else if (question.match(/or higher/i)) {
var hm = question.match(/(\\d+)[\\u00b0]/); if(hm){lo=parseFloat(hm[1]);hi=parseFloat(hm[1])+1;}
}
}
if (lo!==undefined && tid) {
groups[gk].bins.push({lo:lo,hi:hi,mid:(lo+hi)/2,price:price,tokenId:tid,q:question});
}
}
var results = [];
var gks = Object.keys(groups);
for (var k=0; k<gks.length; k++) {
var g = groups[gks[k]];
g.bins.sort(function(a,b){return a.lo - b.lo;});
if (g.bins.length >= 3) results.push(g);
}
return results;
}
Input:search_markets.result