Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Sommare JSON raggruppando per campo

    ciao!

    partendo da questo JSON:
    codice:
    [
      {
        "id": "204",
        "title": "fondazione e terra",
        "author_id": null,
        "author": "isaac asimov",
        "editor_id": null,
        "editor": "oscar mondadori",
        "price": "26.49",
        "isbn": "88-04-32634-4",
        "note": "usato"
      },
      {
        "id": "202",
        "title": "l'orlo della fondazione",
        "author_id": null,
        "author": "isaac asimov",
        "editor_id": null,
        "editor": "oscar mondadori",
        "price": "30.99",
        "isbn": "978-88-04-39816-5",
        "note": "usato"
      },
      {
        "id": "217",
        "title": "preludio alla fondazione",
        "author_id": null,
        "author": "isaac asimov",
        "editor_id": null,
        "editor": "mondadori",
        "price": "27.90",
        "isbn": "88-04-32450-3",
        "note": "usato"
      }
    ]
    io vorrei raggruppare questo json ottendone un altro.
    una cosa del tipo:
    codice:
    [
      {
        "editor": "oscar mondadori",
        "price": "57.48"
      },
      {
        "editor": "mondadori",
        "price": "27.90"
      }
    ]
    sapete come posso fare questo in js??

  2. #2
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    4,619
    Ciao, dovrai prima di tutto convertire la stringa json in un oggetto o array JavaScript, usando JSON.parse() (ma dovrai formattare opportunamente la stringa per avere un json valido) oppure, meglio, usando parseJSON() con jQuery.

    A quel punto puoi utilizzare una delle soluzioni proposte qui:
    https://stackoverflow.com/questions/...in-array-of-ob
    Prima di postare considera che tra i link utili puoi trovare il 75% delle risposte alle tue domande; il 20% tra i post del forum; il 15% sul web.
    Ti resta... humm spè

    Le cattive domande sono quelle che non meritano risposta, le buone domande sono quelle che non hanno risposta
    L'Itailano non e nu'opnioine. E' improntate uslaro correattemtne sul froum. Garize!

  3. #3
    ciao!

    grazie per la segnalazione.
    partendo da uno degli esempi, questo funziona:
    codice:
    $(document).ready(function () {
        const objArr = [
            {editor: "bur", val: 1, val2: 10},
            {editor: "bur", val: 2, val2: 10},
            {editor: "mondadori", val: 9, val2: 1},
            {editor: "oscar mondadori", val: 10, val2: 1}
        ];
    
        const output = objArr.reduce((accumulator, cur) => {
            let found = accumulator.find(elem => elem.editor === cur.editor);
            if (found) {
                found.val += cur.val;
                found.val2 += cur.val2;
            } else {
                accumulator.push(cur);
            }
            return accumulator;
        }, []);
    
        console.log(output)
    });
    tornando invece al mio json, ho un problema banale sul campo prezzo.
    nel json è unn stringa, e quindi non fa la somma corretta:
    codice:
    $(document).ready(function () {
        let json = '[{"id":"204","title":"fondazione e terra","author_id":null,"author":"isaac asimov","editor_id":null,"editor":"oscar mondadori","price":"26.49","isbn":"88-04-32634-4","note":"usato"},{"id":"202","title":"l\'orlo della fondazione","author_id":null,"author":"isaac asimov","editor_id":null,"editor":"oscar mondadori","price":"30.99","isbn":"978-88-04-39816-5","note":"usato"},{"id":"217","title":"preludio alla fondazione","author_id":null,"author":"isaac asimov","editor_id":null,"editor":"mondadori","price":"27.90","isbn":"88-04-32450-3","note":"usato"}]';
        var objArr = jQuery.parseJSON(json);
    
        const output = objArr.reduce((accumulator, cur) => {
            let found = accumulator.find(elem => elem.editor === cur.editor);
            if (found) {
                found.price += parseFloat(cur.price);
            } else {
                accumulator.push(cur);
            }
            return accumulator;
        }, []);
    
        console.log(output)
    });
    a parte questo, cmq sembra funzionare.

  4. #4
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    4,619
    Ciao

    partendo da uno degli esempi, questo funziona:
    Bene

    tornando invece al mio json, ho un problema banale sul campo prezzo.
    nel json è unn stringa, e quindi non fa la somma corretta:
    Chiaro, è dovuto al normale autocasting JavaScript che trasforma tutto in stringa quando viene trovato, nell'espressione, anche solo un membro che sia di tipo stringa; in quel caso l'operando di sinistra è sempre una stringa, per cui non avviene un'addizione numerica ma bensì una concatenazione di stringhe.
    codice:
    found.price += parseFloat(cur.price);

    Per ottenere la somma numerica dovresti convertire preventivamente entrambi gli operandi in valori numerici, come hai cercato di fare per quello a destra dell'operatore.

    Chiaramente non puoi fare in questo modo:
    codice:
    parseFloat(found.price) += parseFloat(cur.price);
    questo restituisce un errore perché il membro a sinistra di tale operatore deve essere per forza una variabile (non il valore restituito da quella funzione) in modo che possa essere eseguita correttamente l'assegnazione.

    In tal caso dovrai scomporre l'operazione in questo modo (come insegna la vecchia scuola):
    codice:
    found.price = parseFloat(found.price) + parseFloat(cur.price);
    cioè i due passaggi (somma e addizione), che con l'operatore += vengono accorpati in un'unica espressione, dovrai ora scomporli per permettere di specificare la conversione del valore di quella variabile prima che sia effettuata la somma e quindi l'assegnazione alla stessa variabile.

    In questo caso è possibile usare, allo stesso modo, la funzione Number() anziché parseFloat():
    codice:
    found.price = Number(found.price) + Number(cur.price);
    oppure la sua forma più sintetica:
    codice:
    found.price = +found.price + +cur.price;

    Se poi ti serve, per un qualche motivo, che quella variabile sia restituita comunque come stringa testuale, dovrai riconvertirla.

    In tal caso potresti fare una cosa del genere:
    codice:
    found.price = (+found.price + +cur.price).toString();
    o con una forma più contratta:
    codice:
    found.price = (+found.price + +cur.price)+"";
    Prima di postare considera che tra i link utili puoi trovare il 75% delle risposte alle tue domande; il 20% tra i post del forum; il 15% sul web.
    Ti resta... humm spè

    Le cattive domande sono quelle che non meritano risposta, le buone domande sono quelle che non hanno risposta
    L'Itailano non e nu'opnioine. E' improntate uslaro correattemtne sul froum. Garize!

  5. #5
    perfetto, ad alcune non ci avevo pensato in effetti.

    grazie!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.