Mam plik json i wszystkie miasta we Włoszech. Każde miasto należy do regionu.

Teraz muszę uzyskać wszystkie wartości popolazione dla każdego regionu

Na przykład. regione: {codice: "03", nome: "Lombardia"} i oblicz sumarycznie dla każdego miasta, aby uzyskać łączną wartość regionu.

Struktura JSON:

{nome: "Dizzasco", codice: "013087", zona: {…}, regione: {…}, provincia: {…}, …}
nome: "Dizzasco"
codice: "013087"
zona: {codice: "1", nome: "Nord-ovest"}
regione: {codice: "03", nome: "Lombardia"}
provincia: {codice: "013", nome: "Como"}
sigla: "CO"
codiceCatastale: "D310"
cap: ["22020"]
popolazione: 565

nome: "Dobbiaco"
codice: "021028"
zona: {codice: "2", nome: "Nord-est"}
regione: {codice: "04", nome: "Trentino-Alto Adige/Südtirol"}
provincia: {codice: "021", nome: "Bolzano/Bozen"}
sigla: "BZ"
codiceCatastale: "D311"
cap: ["39034"]
popolazione: 3314

nome: "Domaso"
codice: "013089"
zona: {codice: "1", nome: "Nord-ovest"}
regione: {codice: "03", nome: "Lombardia"}
provincia: {codice: "013", nome: "Como"}
sigla: "CO"
codiceCatastale: "D329"
cap: ["22013"]
popolazione: 1455

Poszukuje:

Całkowita populacja w Lombardii to 2020

I zrób to dla każdego regionu.

To jest to, co mam, ale popycham każde miasto i każdą populację w każdym mieście, ale brakuje mi logiki, aby zrobić sumę dla każdego regionu. Zastanawiałem się, czy nie sprawdzić, czy inArray czy sprawdzić, czy city string name

 var regioni = [];
 var popolazione = [];

 $.getJSON(url, function(data) {
        for(var d = 0; d < data.length; ++d) {
          var thisDataRegione = data[d];
          var thisDataRegioneNome = thisDataRegione["regione"].nome;
          regioni.push(thisDataRegioneNome["regione"].nome);           
          popolazione.push(data[d].popolazione);
      }
  });
0
rob.m 31 marzec 2020, 23:09

5 odpowiedzi

Najlepsza odpowiedź

Nie wiem, czy naprawdę rozumiem twój json i kod, ale powinieneś być w stanie zrobić coś takiego:

let regioni = {};

$.getJSON(url, function(data) {
    for(var d = 0; d < data.length; ++d) {
        let thisDataRegione = data[d];
        let thisDataRegioneNome = thisDataRegione["regione"].nome;

        // if we see this region name for the first time initialize the count
        // to zero, otherwise add the new population data
        if (regioni[thisDataRegioneNome] === undefined) regioni[thisDataRegioneNome] = 0;
        else regioni[thisDataRegioneNome] += data[d].popolazione;
    }
    // this should be an object that has the regions with the total count 
    // for example regioni["Lambardia"] == 2020
    // and so on
    console.log(regioni);
});
1
wschopohl 31 marzec 2020, 21:33

Zakładając, że jest to faktycznie struktura danych:

[
    {
        nome: "Dizzasco",
        codice: "013087",
        zona: {codice: "1", nome: "Nord-ovest"},
        regione: {codice: "03", nome: "Lombardia"},
        provincia: {codice: "013", nome: "Como"},
        sigla: "CO",
        codiceCatastale: "D310",
        cap: ["22020"],
        popolazione: 565,
    },
    ....
]

Jesteś prawie na miejscu. Musisz zgromadzić liczbę, zamiast przechowywać każdą wartość w tablicy, tak jak robisz to teraz. Widzieć:

var data=[
  {
    nome: "Dizzasco",
    codice: "013087",
    zona: {codice: "1", nome: "Nord-ovest"},
    regione: {codice: "03", nome: "Lombardia"},
    provincia: {codice: "013", nome: "Como"},
    sigla: "CO",
    codiceCatastale: "D310",
    cap: ["22020"],
    popolazione: 565,
  },
  {
    nome: "Dobbiaco",
    codice: "021028",
    zona: {codice: "2", nome: "Nord-est"},
    regione: {codice: "04", nome: "Trentino-Alto Adige/Südtirol"},
    provincia: {codice: "021", nome: "Bolzano/Bozen"},
    sigla: "BZ",
    codiceCatastale: "D311",
    cap: ["39034"],
    popolazione: 3314
  }
];

var populationByRegion={},
  totalPopulation=0;
for(var d = 0; d < data.length; ++d) {
  var item=data[d],
    thisDataRegioneNome=item.regione.nome,
    population=item.popolazione;
  //If this is the first time we find this region, initialize the accumulator
  if(!populationByRegion.hasOwnProperty(thisDataRegioneNome)) populationByRegion[thisDataRegioneNome]=0;
  //Then just sum the population
  populationByRegion[thisDataRegioneNome]+=population;
  //You can also count the total among all the regions
  totalPopulation+=population;
}

console.log("Population by region",populationByRegion);
console.log("Total",totalPopulation);
0
Gabriel 1 kwiecień 2020, 01:04

Nie musisz utrzymywać dwóch różnych tablic. Możesz dodać to do obiektu takiego jak ten, teraz masz region jako klucz i całkowitą populację jako wartość. jeśli chcesz mieć wszystkie możliwe regiony Object.keys(regionePopulation). To da szereg regionów.

var regionePopulation = {};
$.getJSON(url, function(data) {
        data.forEach((item) => regionePopulation[item.regione.name] = !regionePopulation[item.regione.name] ? item.popolazione : regionePopulation[item.regione.name] + item.popolazione)
console.log(regionePopulation)
  });
1
Gaurav Singh 31 marzec 2020, 21:11

Spróbuj tego:

let regioni = {}

$.getJSON(url, function(data) {
   data.forEach(value => {
        const currentRegion = value.regione.nome

        if (regioni[currentRegion])
            regioni[currentRegion] = value.popolazione

        else 
            regioni[currentRegion] += value.popolazione
   }) 
});
0
Mark Minerov 31 marzec 2020, 20:21

Możesz użyć obiektu lub mapy do przechowywania nazw regionów jako klucza i populacji jako wartości, jak poniżej:

let arr = [{
    nome: "Dizzasco",
    codice: "013087",
    zona: {
      codice: "1",
      nome: "Nord-ovest"
    },
    regione: {
      codice: "03",
      nome: "Lombardia"
    },
    provincia: {
      codice: "013",
      nome: "Como"
    },
    sigla: "CO",
    codiceCatastale: "D310",
    cap: ["22020"],
    popolazione: 565,
  },
  {
    nome: "Dobbiaco",
    codice: "021028",
    zona: {
      codice: "2",
      nome: "Nord-est"
    },
    regione: {
      codice: "04",
      nome: "Trentino-Alto Adige/Südtirol"
    },
    provincia: {
      codice: "021",
      nome: "Bolzano/Bozen"
    },
    sigla: "BZ",
    codiceCatastale: "D311",
    cap: ["39034"],
    popolazione: 3314,
  }, {
    nome: "Domaso",
    codice: "013089",
    zona: {
      codice: "1",
      nome: "Nord-ovest"
    },
    regione: {
      codice: "03",
      nome: "Lombardia"
    },
    provincia: {
      codice: "013",
      nome: "Como"
    },
    sigla: "CO",
    codiceCatastale: "D329",
    cap: ["22013"],
    popolazione: 1455
  }
];

const summs = {};

arr.forEach(v => {
  const region = v.regione.nome;
  const population = v.popolazione;
  if (summs[region])
    summs[region] += population
  else summs[region] = population
});
console.log(summs);

const regions = Object.keys(summs);
console.log(regions);
const regionsWithPopulations = Object.entries(summs);
console.log(regionsWithPopulations);

const lombardiaPopulation = summs[regions[0]];
console.log(lombardiaPopulation);
const lombardiaPopulationAlt = regionsWithPopulations[0][1];
console.log(lombardiaPopulationAlt);
0
Eldar 31 marzec 2020, 20:35