Filtrowanie szeregu obiektów wg cechy

0

Witam,
w jaki sposób wyfiltrować tylko te obiekty, które dotyczą np. Polski i Niemiec.
Pobieram dane z tego adresu: https://opendata.ecdc.europa.eu/covid19/casedistribution/json/ i chcę aby pobierane były tylko dane, które dotyczą krajów umieszczonych w filtrze.

(function() {
    // Create the connector object
    var myConnector = tableau.makeConnector();

    // Define the schema
    myConnector.getSchema = function(schemaCallback) {
        var cols = [{
            id: "dateRep",
            alias: "Data",
            dataType: tableau.dataTypeEnum.date
        },{
            id: "cases",
            alias: "Ogółem hospitalizowani",
            dataType: tableau.dataTypeEnum.int
        },{
            id: "deaths",
            alias: "Zgony",
            dataType: tableau.dataTypeEnum.int
        },{
            id: "countriesAndTerritories",
            alias: "Nazwa kraju",
            dataType: tableau.dataTypeEnum.string
        },{
            id: "countryterritoryCode",
            alias: "Kraj",
            dataType: tableau.dataTypeEnum.string
        },{
            id: "popData2019",
            alias: "popData2019",
            dataType: tableau.dataTypeEnum.int
        },{
            id: "continentExp",
            alias: "kontynent",
            dataType: tableau.dataTypeEnum.string
        },{
            id: "Cumulative",
            alias: "Na 1000",
            dataType: tableau.dataTypeEnum.int
        },
        ];
        var tableSchema = {
            id: "LUG",
            alias: "CovidLUG",
            columns: cols
        };

        schemaCallback([tableSchema]);
    };

    // Download the data
    myConnector.getData = function(table, doneCallback) {

        $.getJSON("https://opendata.ecdc.europa.eu/covid19/casedistribution/json/", function(resp) {
            //var list = data.json(),       // what method to call? .feature .ts .list..
            
            var data = resp.records,          
                 tableData = [];
           
        console.log(data) 
            // Iterate over the JSON object
            for (var i = 0; i < data.length; i++) {
                tableData.push({
                    "dateRep": data[i]["dateRep"],                
                    "cases": data[i]["cases"],
                    "deaths": data[i]["deaths"],
                    "countriesAndTerritories": data[i]["countriesAndTerritories"],                   
                    "countryterritoryCode": data[i]["countryterritoryCode"],
                    "popData2019": data[i]["popData2019"],
                    "continentExp": data[i]["continentExp"],                  
                    "Cumulative": data[i],
                });
            }
            
            table.appendRows(tableData);
            doneCallback();
        });
    };

    tableau.registerConnector(myConnector);

    // Create event listeners for when the user submits the form
    $(document).ready(function() {
        $("#submitButton").click(function() {
            tableau.connectionName = "CovidLUG"; // This will be the data source name in Tableau
            tableau.submit();                     // This sends the connector object to Tableau
        });
    });
})();
0

Nikt nie wie jak ustawić taki filtr? Wydaje się, że to musi być bardzo proste i jest to jedna z podstawowych funkcjonalności. Dla mnie jednak nie jest proste, zważywszy iż jeszcze miesiąc temu nie miałem pojęcia o programowaniu (żadnym). Przez ostatni miesiąc intensywnie się uczę js i rozumiem jaki takie connectory działają ale nie wiem jak poruszać się po danych. Docelowo i tak chcę to wykorzystać do pobierania danych ekonomicznych a tam niektóre dane są bardzo rozbudowane i chce zrozumieć jak się po nich poruszać - pobierać te, które mnie interesują.
Sporo czasu spędziłem na tym filtrowaniu ale gdy testuje to albo pobiera mi wszystko albo nic ale wówczas consola nie wywala mi żadnych błędów i nie wiem co robię źle.
Dlatego byłbym wdzięczny za jakieś wskazówki.
Dodam tylko, że wykorzystuje taki connector (web data connector) w programie Tableau (coś jakby połączenie excela z powerpointem).

0

Skopiowałem dane z adresu API i poniższym filtrem udało mi się uzyskać tylko obiekty dla Polski. Jednakże oryginalne dane zaczynają się od

{
   "records" : [
      {
         "dateRep" : "28/08/2020",
         "day" : "28", ...

I zwraca mi błąd, że cols (lub records) nie zostało zdefiniowane. Podejrzewam, że gdyby w danych byłoby var records = [... to filtr by działał.
Ktoś ma jakiś pomysł na rozwiązanie?

(tu działa ok)

var cols = [
  {
     "dateRep" : "28/08/2020",
     "day" : "28",
     "month" : "08",
     "year" : "2020",
     "cases" : 3,
     "deaths" : 0,
     "countriesAndTerritories" : "Afghanistan",     
  },
  {
     "dateRep" : "27/08/2020",
     "day" : "27",
     "month" : "08",
     "year" : "2020",
     "cases" : 55,
     "deaths" : 4,
     "countriesAndTerritories" : "Poland",
  }];

   var kraj = cols.filter((obj) => {                                  //tu filtr działa ok
                var flag = false;
                Object.values(obj).forEach((val) => {
                  if(String(val).indexOf("Poland") > -1) {
                    flag = true;
                    return;
                  }    
                });
                if(flag) return obj;
              });

console.log(kraj);
0

Jak uzyskać dostęp do cechy obiektu/ów gdy znajduje się on w nawiasach[]. Gdy nie ma nawiasów to wiem.

const person = [{
    "name" : "Marcin",
    "pet" : {
        name : "Szarik",
        color : "brown",
        "speed" : 10,   
        "food" : ["mięso", "sucha_karma"]
    }
}];```

console.log(person.pet.food[1]);
1

Nawiasy to tablice

[0], [1], ...

0

To rozumiem, a jak w powyższym przykładzie zwrócić wartość mięso? Gdyby nie było nawiasów [] to wystarczyłoby console.log(person.pet.food[1]);

1

To też jest tablica więc console.log(person[0].pet.food[1]);

2
muad napisał(a):

To rozumiem, a jak w powyższym przykładzie zwrócić wartość mięso? Gdyby nie było nawiasów [] to wystarczyłoby console.log(person.pet.food[1]);

person[0].pet.food[0]

Z jakiegos powodu zrobiles z person tablice

0

Jest ok, dzięki. Celowo stworzyłem tablicę. W sumie taki mix tablic i obiektów jest w danych API, które zamierzam pobierać.

1

Codepen? A wez wcisnij F12 :)

U mnie dziala

0

W jaki sposób mogę dodać do filtra drugi kraj?

const filteredData = data.filter(item => item.countriesAndTerritories === 'Italy')
1
muad napisał(a):

W jaki sposób mogę dodać do filtra drugi kraj?

const filteredData = data.filter(item => item.countriesAndTerritories === 'Italy')
 const filteredData = data.filter(item => item.countriesAndTerritories === 'Italy' || item.countriesAndTerritories === 'Drugi Kraj')
0

Dzięki bardzo.

0

Witam, w jaki sposób mógłbym nałożyć filtr w tablicy obiektów przy skrypcie ,,drag and drop". Mam na myśli przenoszę kilka różnych dokumentów zdjęcia, txt, doc etc i chciałbym aby po upuszczeniu plików w pole (div) wyświetlało mi informację o nazwie pliku wielkości i ikona zgodna z typem pliku. Jeśli jest to zdjęcie ma wyświetlić jego miniaturkę jeśli plik doc wyświetla ikonkę doc oraz nazwę i wielkość pliku.

Próbowałem walczyć konstrukcją if else, ale nie zdaje egzaminu. Blogi podpowiadają przekształcenie tablicy obiektów na tablicę i zastosowania filtra, ale nie jestem pewien czy jest to dobra droga.

drag_and_drop_drag_file_and_display.js

1

Nie jestem pewien, czy rozwiązujesz właściwy problem. Mam wrażenie, że zagrzebałeś się w skryptach, plus nie jestem pewien, czego dokładnie używasz (jQuery?).

chciałbym aby po upuszczeniu plików w pole (div) wyświetlało mi informację o nazwie pliku wielkości i ikona zgodna z typem pliku. Jeśli jest to zdjęcie ma wyświetlić jego miniaturkę jeśli plik doc wyświetla ikonkę doc oraz nazwę i wielkość pliku.

Jak masz zdarzenie drop (mówię o natywnym zdarzeniu w przeglądarce, nie pamiętam jak jest w jQuery, jeśli z niego korzystasz), to masz tam właściwość dataTransfer, która z kolei zawiera właściwość files, która reprezentuje listę plików. Każdy plik ma m.in. właściwości name i
type. https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer

Tak to można rozwiązać (bez jQuery), żeby wyświetlić nazwy i typy plików:
https://jsfiddle.net/259j74q0/

natomiast jeśli chcesz przefiltrować, mógłbyś to zrobić np. tak:
https://jsfiddle.net/0hd2q9zg/
(wybiera tylko pliki, które mają typ 'image/jpeg' albo 'image/png')

Blogi podpowiadają przekształcenie tablicy obiektów na tablicę i zastosowania filtra,

Na przykład:

const someFilter = (file) => TUTAJ ZDECYDUJ, CZY PLIK PRZECHODZI;
// ...
Array.from(e.dataTransfer.files).filter(someFilter)

Array.from zamienia listę plików na tablicę, filter nałoży filtr.
I mając tablicę, możesz dalej z nią coś zrobić, np. przejść forEach po niej:

Array.from(e.dataTransfer.files).filter(filter).forEach(file => {
  // ....
});

Czyli tak, jak zrobiłem w tym jsFiddle.

1 użytkowników online, w tym zalogowanych: 0, gości: 1