jsde bir sınıf hazırladım filtrelemeyi böyle yapabilirsiniz
class CustomFilterize{
constructor(maxPage = 1) {
this.start = 1;
this.totalCount = 0;
this.maxPage = maxPage;
this.limit = 100;
this.sortBy = 'market_cap';
this.sortType = 'desc';
this.convert = 'USD,BTC,ETH';
this.cryptoType = 'all';
this.tagType = 'all';
this.audited = 'false';
this.aux = 'ath,atl,high24h,low24h,num_market_pairs,cmc_rank,date_added,max_supply,circulating_supply,total_supply,volume_7d,volume_30d,self_reported_circulating_supply,self_reported_market_cap';
this.data = [];
this.filters = [];
this.completeData = null;
}
async page(limit = 3,start = 0){
if(this.totalCount != 0){
const maxPage = Math.round( this.totalCount / this.limit);
if(limit > maxPage) limit = maxPage;
}
for(let i = 1 ; i <= limit; i++){
this.start = ((i-1) * this.limit) + 1 + start;
const data = await this.get();
this.totalCount = parseInt(data.data.totalCount);
this.data.push(data);
}
return this.data;
}
filter(attribute,value , equal = '='){
this.filters.push({
key:attribute,value:value,condition:equal,status: false
})
return this;
}
async searchPage(page = 1){
if(this.completeData == null){
this.completeData = await this.page(page);
}else if(this.completeData.length < page){
let start = this.completeData.length * this.limit;
let pages = page - this.completeData.length;
const p = await this.page(pages,start);
this.completeData = [...this.completeData,...p];
}else if(this.completeData.length > page){
return this.process(this.completeData.slice(0,page))
}
return this.process(this.completeData);
}
process(data){
let filterList = [];
for(let i = 0; i < data.length;i++){
const list = data[i].data.cryptoCurrencyList;
for(let k = 0; k < list.length;k++ ){
if(this.equal(list[k])){
/* şarrtları karşılıyosa*/
filterList.push(list[k])
}
}
}
this.filters = [];
console.table(filterList);
return filterList;
}
equal(item){
if(this.filters.length == 0) return true;
for(let i = 0; i < this.filters.length;i++){
let filter = this.filters[i];
filter.status = false;
if(item[filter.key]){
if(filter.condition == 'between'){
if(Array.isArray(filter.value) && filter.value.length == 2){
filter.status = item[filter.key] >= filter.value[0] && item[filter.key] <= filter.value[1];
}else{
console.error(`${filter.key} elamanı between için en az 2 elaman bulunmadığından kaldırıldı.`);
delete this.filters[i];
i--;
}
}else if(filter.condition == '<'){
filter.status = item[filter.key] < filter.value;
}else if(filter.condition == '<='){
filter.status = item[filter.key] <= filter.value;
}else if(filter.condition == '>'){
filter.status = item[filter.key] > filter.value;
}else if(filter.condition == '>='){
filter.status = item[filter.key] >= filter.value;
}else if(filter.condition == '='){
filter.status = item[filter.key] == filter.value;
}else if(filter.condition == '=!' || filter.condition == '<>'){
filter.status = item[filter.key] != filter.value;
}else{
console.error(`${filter.condition} bu koşullar için uyarlanmamıştır ve sorguya dahil edilmedi.`);
delete this.filters[i];
i--;
}
}else{
console.error(`${filter.key} adında bir elaman bulunamadığı için arama kriterlerinden kaldırıldıi.`);
delete this.filters[i];
i--;
}
}
if(this.filters.length == 0) return true;
return this.filters.every(item => item.status);
}
async get(){
return await fetch(`https://api.coinmarketcap.com/data-api/v3/cryptocurrency/listing?start=${this.start}&limit=${this.limit}&sortBy=${this.sortBy}&sortType=${this.sortType}&convert=${this.convert}&cryptoType=${this.cryptoType}&tagType=${this.tagType}&audited=${this.audited}&aux=${this.aux}`, {
"headers": {
"accept": "application/json, text/plain, */*",
"accept-language": "tr-TR,tr;q=0.9,en-US;q=0.8,en;q=0.7",
"platform": "web",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"102\", \"Google Chrome\";v=\"102\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-site",
"x-request-id": "06b9969b3ada4f3ca7ef99af3145af84"
},
"referrer": "https://coinmarketcap.com/",
"referrerPolicy": "origin-when-cross-origin",
"body": null,
"method": "GET",
"mode": "cors",
"credentials": "omit"
}).then(response => response.json())
}
}
/*
ELAMAN DEĞERLERİ BUNLAR
ELAMAN ADI : ELAMAN DEĞERİ
ath: 68789.62593892214
atl: 65.5260009765625
circulatingSupply: 19059018
cmcRank: 1
dateAdded: "2013-04-28T00:00:00.000Z"
high24h: 30117.743447499455
id: 1
isActive: 1
isAudited: false
lastUpdated: "2022-06-05T18:58:00.000Z"
low24h: 29574.44953148884
marketPairCount: 9478
maxSupply: 21000000
name: "Bitcoin"
quotes: (3) [{
}, {
}, {
}]
selfReportedCirculatingSupply: 0
slug: "bitcoin"
symbol: "BTC"
totalSupply: 19059018
*/
const custom = new CustomFilterize();Kullanımı ;
// ath değeri 68789 den küçük ve isActive değeri 1 olanları 1 sayfa boyuncu filtere
// 1 sayfa değeri limit 100 olarak belirlenmiştir 10 sayfa 10 * 100 değer
customFilter.filter("ath",68789 ,"<").filter("isActive","1").searchPage(1)// ath değeri 1000 ile 5000 arasında ve isActive değeri 1 olanlarır 1 sayfada filtrele
customFilter
.filter("ath",[1000,5000],"between")
.filter("isActive","1")
.searchPage(1)// arama kriterleri eşittir,küçüktür , büyüktür , büyük eşit , küçük eşit ,eşit değil , arasında
// = ,< , <= ,> , >= , between , !=
.filter("maxSupply ",[1000,5000],"between").searchPage(1)Sonuc tablo olarak listelenir.
iyi forumlar..