update sorting algorithm

This commit is contained in:
MuslemRahimi 2024-10-10 12:39:21 +02:00
parent 4c3f2d2cfd
commit aa576406a6

View File

@ -844,124 +844,92 @@ function sortData(key) {
} }
// Cycle through 'none', 'asc', 'desc' for the clicked key // Cycle through 'none', 'asc', 'desc' for the clicked key
if (key === 'time') { const orderCycle = ['none', 'asc', 'desc'];
// Only cycle between 'asc' and 'desc' for the 'time' key const currentOrderIndex = orderCycle.indexOf(sortOrders[key]);
if (sortOrders[key] === 'asc') { sortOrders[key] = orderCycle[(currentOrderIndex + 1) % orderCycle.length];
sortOrders[key] = 'desc';
} else {
sortOrders[key] = 'asc';
}
} else {
// Cycle through 'none', 'asc', 'desc' for other keys
if (sortOrders[key] === 'none') {
sortOrders[key] = 'asc';
} else if (sortOrders[key] === 'asc') {
sortOrders[key] = 'desc';
} else {
sortOrders[key] = 'none';
}
}
const sortOrder = sortOrders[key]; const sortOrder = sortOrders[key];
const originalData = filteredData?.length !==0 ? [...filteredData] : [...rawData]; const originalData = filteredData?.length !== 0 ? [...filteredData] : [...rawData];
if (sortOrder === 'none') {
// Reset to original data when 'none' // Reset to original data when 'none'
if (sortOrder === 'none') {
displayedData = originalData; displayedData = originalData;
} else { return;
displayedData = [...originalData]?.sort((a, b) => { }
if (key === 'time') {
// Handle time comparison const compareFunctions = {
time: (a, b) => {
const timeA = new Date('1970-01-01T' + a.time).getTime(); const timeA = new Date('1970-01-01T' + a.time).getTime();
const timeB = new Date('1970-01-01T' + b.time).getTime(); const timeB = new Date('1970-01-01T' + b.time).getTime();
return sortOrder === 'asc' ? timeA - timeB : timeB - timeA; return sortOrder === 'asc' ? timeA - timeB : timeB - timeA;
} else if (key === 'ticker') { },
// Handle alphabetical comparison for symbol ticker: (a, b) => {
const tickerA = a.ticker.toUpperCase(); const tickerA = a.ticker.toUpperCase();
const tickerB = b.ticker.toUpperCase(); const tickerB = b.ticker.toUpperCase();
if (sortOrder === 'asc') { return sortOrder === 'asc' ? tickerA.localeCompare(tickerB) : tickerB.localeCompare(tickerA);
return tickerA > tickerB ? 1 : -1; },
} else { expiry: (a, b) => {
return tickerA < tickerB ? 1 : -1; const timeA = new Date(a.date_expiration);
} const timeB = new Date(b.date_expiration);
} else if (key === 'expiry' || key==='dte') {
// Handle alphabetical comparison for symbol
const timeA = new Date (a?.date_expiration);
const timeB = new Date (b?.date_expiration);
return sortOrder === 'asc' ? timeA - timeB : timeB - timeA; return sortOrder === 'asc' ? timeA - timeB : timeB - timeA;
} else if (key === 'strike') { },
// Handle numeric comparison for strike dte: (a, b) => {
const strikeA = parseFloat(a.strike_price); // Convert to float for comparison const timeA = new Date(a.date_expiration);
const timeB = new Date(b.date_expiration);
return sortOrder === 'asc' ? timeA - timeB : timeB - timeA;
},
strike: (a, b) => {
const strikeA = parseFloat(a.strike_price);
const strikeB = parseFloat(b.strike_price); const strikeB = parseFloat(b.strike_price);
return sortOrder === 'asc' ? strikeA - strikeB : strikeB - strikeA; return sortOrder === 'asc' ? strikeA - strikeB : strikeB - strikeA;
},
} else if (key === 'spot') { spot: (a, b) => {
// Handle numeric comparison for strike const spotA = parseFloat(a.underlying_price);
const strikeA = parseFloat(a.underlying_price); // Convert to float for comparison const spotB = parseFloat(b.underlying_price);
const strikeB = parseFloat(b.underlying_price); return sortOrder === 'asc' ? spotA - spotB : spotB - spotA;
return sortOrder === 'asc' ? strikeA - strikeB : strikeB - strikeA; },
} else if (key === 'price') { price: (a, b) => {
// Handle numeric comparison for strike const priceA = parseFloat(a.price);
const strikeA = parseFloat(a?.price); // Convert to float for comparison const priceB = parseFloat(b.price);
const strikeB = parseFloat(b?.price); return sortOrder === 'asc' ? priceA - priceB : priceB - priceA;
return sortOrder === 'asc' ? strikeA - strikeB : strikeB - strikeA; },
} else if (key === 'premium') { premium: (a, b) => {
// Handle numeric comparison for strike const premiumA = parseFloat(a.cost_basis);
const strikeA = parseFloat(a.cost_basis); // Convert to float for comparison const premiumB = parseFloat(b.cost_basis);
const strikeB = parseFloat(b.cost_basis); return sortOrder === 'asc' ? premiumA - premiumB : premiumB - premiumA;
return sortOrder === 'asc' ? strikeA - strikeB : strikeB - strikeA; },
} else if (key === 'vol') { vol: (a, b) => {
// Handle numeric comparison for strike const volA = parseFloat(a.volume);
const strikeA = parseFloat(a.volume); // Convert to float for comparison const volB = parseFloat(b.volume);
const strikeB = parseFloat(b.volume); return sortOrder === 'asc' ? volA - volB : volB - volA;
return sortOrder === 'asc' ? strikeA - strikeB : strikeB - strikeA; },
} else if (key === 'oi') { oi: (a, b) => {
// Handle numeric comparison for strike const oiA = parseFloat(a.open_interest);
const strikeA = parseFloat(a.open_interest); // Convert to float for comparison const oiB = parseFloat(b.open_interest);
const strikeB = parseFloat(b.open_interest); return sortOrder === 'asc' ? oiA - oiB : oiB - oiA;
return sortOrder === 'asc' ? strikeA - strikeB : strikeB - strikeA; },
} else if (key === 'callPut') { callPut: (a, b) => {
// Handle Call/Put sorting const callPutA = a.put_call?.toUpperCase();
const callPutA = a?.put_call?.toUpperCase(); // Normalize to uppercase const callPutB = b.put_call?.toUpperCase();
const callPutB = b?.put_call?.toUpperCase(); return sortOrder === 'asc' ? callPutA.localeCompare(callPutB) : callPutB.localeCompare(callPutA);
if (sortOrder === 'asc') { },
return callPutA > callPutB ? 1 : -1; sentiment: (a, b) => {
} else { const sentimentOrder = { 'BULLISH': 1, 'NEUTRAL': 2, 'BEARISH': 3 };
return callPutA < callPutB ? 1 : -1; const sentimentA = sentimentOrder[a.sentiment?.toUpperCase()] || 4;
}
} else if (key === 'sentiment') {
// Handle sentiment sorting
const sentimentOrder = {
'BULLISH': 1,
'NEUTRAL': 2,
'BEARISH': 3,
};
const sentimentA = sentimentOrder[a.sentiment?.toUpperCase()] || 4; // Fallback for undefined values
const sentimentB = sentimentOrder[b.sentiment?.toUpperCase()] || 4; const sentimentB = sentimentOrder[b.sentiment?.toUpperCase()] || 4;
return sortOrder === 'asc' ? sentimentA - sentimentB : sentimentB - sentimentA;
if (sortOrder === 'asc') { },
return sentimentA - sentimentB; // Ascending order type: (a, b) => {
} else { const typeOrder = { 'SWEEP': 1, 'TRADE': 2 };
return sentimentB - sentimentA; // Descending order const typeA = typeOrder[a.option_activity_type?.toUpperCase()] || 3;
} const typeB = typeOrder[b.option_activity_type?.toUpperCase()] || 3;
} else if (key === 'type') { return sortOrder === 'asc' ? typeA - typeB : typeB - typeA;
// Handle sentiment sorting },
const sentimentOrder = {
'SWEEP': 1,
'TRADE': 2,
}; };
const sentimentA = sentimentOrder[a?.option_activity_type?.toUpperCase()] || 3; // Fallback for undefined values
const sentimentB = sentimentOrder[b?.option_activity_type?.toUpperCase()] || 3;
if (sortOrder === 'asc') { // Sort using the appropriate comparison function
return sentimentA - sentimentB; // Ascending order displayedData = originalData.sort(compareFunctions[key]);
} else { }
return sentimentB - sentimentA; // Descending order
}
}
});
}
}
</script> </script>