Sterge elementele inutile din JSON

Am descarcat acest fisier in format json care contine toate tarile, orasele si comunele.
Incerc sa fac 3 selectii (tara, oras, comuna), se incarca cam greu, fisierul are 34MB

var myJson = {

};


$.each(myJson.country, function (index, value) {
    var country_id;
    var state_id;
    var city_id;
        
        $("#country").append('<option rel="' + index + '" value="'+value.id+'">'+value.name+'</option>');
        
        $("#country").change(function () {
            $("#state, #city").find("option:gt(0)").remove();
            $("#state").find("option:first").text("Loading...");
            
            country_id = $(this).find('option:selected').attr('rel');
            console.log("Country INDEX : " + country_id);
            
            $.each(myJson.country[country_id].states, function (index1, value1) {
                $("#state").find("option:first").text("Choisir");
                $("#state").append('<option rel="' + index1 + '" value="'+value1.id+'">'+value1.name+'</option>');
            });
            
        });
    
        
        $("#state").change(function () {
            $("#city").find("option:gt(0)").remove();
            $("#city").find("option:first").text("Loading...");
            
            state_id = $(this).find('option:selected').attr('rel');
            console.log("State INDEX : " + state_id);
                        
            $.each(myJson.country[country_id].states[state_id].cities, function (index2, value2) {
                $("#city").find("option:first").text("");
                $("#city").append('<option rel="' + index2 + '" value="'+value2.id+'">'+value2.name+'</option>');
            });
            
                   
        });     
    
});

Cum as putea sa sterg informatiile inutile?
Eu am nevoie doar de: name, iso2, phone_code, latitude, longitude, state_code
Cum as putea sa sterg restul informatiilor rapid?

Deseori e preferabil sa construiesti un obiect nou cu datele necesare decât sa modifici un obiect existent ștergând ce nu ai nevoie.

Având in vedere numărul mare de înregistrări cred ca te-ar avantaja mai mult sa le pui intr-o baza de date, ar fi mai rapida căutarea.

2 Likes

vezi și jq - lightweight and flexible command-line JSON processor. also: zed, jello.

4 Likes

Sau:

  • împarți fișierul in mai multe fișiere - pe județe de ex
  • procesezi selecția datelor pe server
  • sau ambele de mai sus, împreună

Depinde de cum le folosești.

1 Like

Nu inteleg de ce este asta marcata ca si solutie. Este o solutie proasta pentru urmatoarele motive:

  • baza de date pentru 34Mb de json? Nu-i prea mult overhead pentru ceva atat de simplu ca se poate rezolva foarte foarte rapid cu o singura linie de cod?

  • OP-ul nu a specificat daca e o operatie one-off sau nu, dar sa recomanzi o baza de date pentru o solutie one-off e ca si cum ti-as recomanda un tractor cand tu ai nevoie doar de o lopata

  • Mama lor de transformari pe json, in orice limbaj ai face-o o sa fie slow-ish; nu mai bine lasi o unealta specializata si performanta sa faca treaba asta pentru tine? Mai ales daca este o chestie one-off.

O solutie mult mai buna fara toate dezavantajele de mai sus ar fi ce a mentionat si @pax , sa folosesti jq:

jq ‘. | .name,.iso2’ fisier.json > fisierFiltrat.json

P.S. Sa nu mai zic ca OP cauta cum sa stearga elemente dintr-un json, iar raspunsul ii sugereaza sa bage intr-o baza de date ca sa caute mai rapid. Noaptea mintii.

5 Likes

Alternativ, este si un json cu informatiile de care are nevoie op

Uneori trebuie sa te mai bazezi și pe intuiție sau pe cât de comună e problema pe care o întâmpină utilizatorul. Mie ceva îmi spune că nu vorbim despre o situație one-off, ci că are legătură cu o întreagă aplicație.

Apoi, subiectul e deschis în categoria Databases. Dacă nu l-a mutat administratorul până să văd eu asta, atunci cu atât mai mult nu vorbim despre un caz one-off.

Deci, cel mai probabil are nevoie de o bază de date din care va interoga/extrage datele în funcție de nevoi.

2 Likes

Nu e “noaptea mintii” daca te uiti peste campurile utile din json si vezi ca e nevoie de coordonate geografice, ceea ce duce cu gandul la interogari de genul “toate localitatile aflate la mai putin de 50km de locatia X”. Parca bazele de date nu mai suna asa rau, nu? Mai un cache, mai o indexare, si o scoti elegant la capat.

SQLite ar fi ok.

Nu inteleg de ce ne apucam sa facem presupuneri cand OP a descris foarte bine problema lui si ce nevoie are. Este una din postarile scrise cum trebuie, cu exemplu si la obiect.

Strict pe ce a scris OP si cum vrea sa rezolve problema, solutia acceptata este una neclara si ne-descrisa complet.

Referitor la ce ai zis tu si la postarea mea initiala, OP are nevoie de o lopata, solutia acceptata ii da un tractor si tu zici sa-i mai punem si GPS.

N-ai avut clienti care nu stiu ce vor? Dupa un timp te obisnuiesti sa pui raul in fata si sa anticipezi cam ce se doreste de fapt.

Nu vreau sa pornesc discutii, ci doar sa atenuez concluziile prea abrupte.

Eu cred totuși că inițiatorul subiectului intenționează să folosească selecția din formular în relație cu alte date, din afara acelui fișier/object json. În condițiile astea, trebuie să folosească baze de date relaționale. Dincolo de beneficiile indexării, mai presus de atât ar fi constrângerile, care nu trebuie să lipsească tocmai din pricina integrității datelor.

Dacă am dreptate că are de gând să folosească datele din acel fișier în corelație cu alte date, ar fi ilogic (bad practice) să aibă datele stocate separat, chiar și dacă vorbim de două fișiere/obiecte json (n-ar exista constrângeri reale pentru că datele, ori dintr-un loc, ori dintr-altul, ar putea fi alterate în viitor). Pentru asta există conceptul de bază de date cu informații relaţionate.

Acum, nu spun că e imposibil să fie și o necesitate one-off, dar sunt mai mari șansele să fie cum spun eu. Adică, este foarte comun să afișezi într-o aplicație date care să corespundă unei locații (țară, județ, oraș etc, poate chiar coordonate bounding box). Datele afișate ulterior ar putea fi ale unor companii, obiective, proprietăți și exemplele pot continua.

Sunt în general încăpățânat. Am trimis pm inițiatorului. Ar fi frumos din partea lui să ne spună, cinstit, cum intenționează să folosească datele.

Donez 100 $, devforum, dacă mă înșel și nu are nevoie de o bază de date. Fără niciun resentiment!

Până la urmă, mă bazez pe felul în care e scris codul, dar și pe use case. Pot la fel de bine să fiu indus în eroare și de … experiența inițiatorului.