NEWS

[gelöst]-JS-hilfe beim sortieren eines JSONs



  • hat jmd einen tipp wie man ein json sortiert?

    das json sieht so aus und die sotierung sollte nach dem hostnamen sein :
    Image 2.png


  • Developer

    @liv-in-sky Wenn es eine manuelle Aktion sein darf:
    VSCode mit dem Plugin Sort-JSON.



  • @AlCalzone danke - ich meinte in einem script - ich bekomme diese daten immer wieder und lese sie aus - damit erstelle ich einen datenpunkt, der als html-formatiert ist- also genau gesagt - drei datenpukte (hostname, macadresse und ssid-

    jetzt stehe ich vor dem problem: entweder ich sortiere das json nachdem es angekommen ist oder ich muss bevor ich das html erzeuge ein eigenes object erstellen und dieses sortieren (wäre doch "doppelt-gemobbelt") - oder hast du eine idee

    ich habe auch sort-json in zusätzliche module mal eingetragen - aber ich glaube die wollen nur dateien von der festplatte - oder verstehe ich das falsch
    https://www.npmjs.com/package/sort-json



  • @liv-in-sky
    Versuche es mal so (nicht getestet):

    var data = JSON.parse(json).data; // Array
    data.sort(function(a, b) {
        if(a.hostname < b.hostname) return -1;
        if(a.hostname > b.hostname) return 1;
        return 0;
    });
    

    Quelle


  • Developer

    @liv-in-sky Ahh, ich hatte dich falsch verstanden, du willst ein Array von Objekten nach einem Schlüssel sortieren. Paul hatte mal wieder die richtige Antwort.

    Immerhin hast du mich auch falsch verstanden 😆
    Ich meinte nicht das node-Modul sort-json, sondern das Plugin für VSCode. Das sortiert aber ein einzelnes Objekt nach den Schlüsseln, z.B. so:

    {
        "z": ...,
        "b": ...,
        "a": ...
    }
    

    wird im Editor zu

    {
        "a": ...,
        "b": ...,
        "z": ...
    }
    


  • @paul53 @AlCalzone

    ich hab das schon mal versucht - -aber leider ohne erfolg:

    das problem war, das ich das parsen auf - die erste zeile von paul nicht hinbekommen hatte - bzw. nicht wußte, dass dies ein guter weg wäre

    danke an euch beide jetzt klappt es !!!!

    1445small--robots-winziger.png



  • @AlCalzone @paul53

    sorry - jetzt hätte ich noch eine frage:

    habe eine constante:

    const wifis = {
       "WLAN_Dragon1": { name: "WLAN_Dragon1", id: "xxxxxxxxxx", desc: "WLAN_Dragon", smart: "WLAN_DragonRoot1" } ,
       "WLAN_DragonGuest": { name: "WLAN_DragonGuest", id: "xxxxxxxxx", desc: "WLAN_DragonGuest", smart: "WLAN_DragoGuest" }
    }
    let wifiDPs = [];
    

    und es werden automatisch datenpunkte dazu angelegt:

    for(let wifi_name in wifis) {
      // wifiDPs.push(dpPrefix + wifis[wifi_name].id);
         wifiDPs.push(dpPrefix + "WLANUnifi." + wifis[wifi_name].name);
        
        createState(dpPrefix + "WLANUnifi."+ wifi_name, {
           name: wifis[wifi_name].desc,
           role: 'state',
           read: true,
           write: true,
           type: "boolean",
           smartName: {
               de: wifis[wifi_name].smart,
               smartType: "SWITCH"
           }
             });
           createState(dpPrefix + "WLANUnifi."+ wifi_name + "_Schalter", {
           name: wifis[wifi_name].desc,
           role: 'state',
           read: true,
           write: true,
           type: "boolean",
           smartName: {
               de: wifis[wifi_name].smart,
               smartType: "SWITCH"
           }
    
       });
    
    }
    

    leider check ich nicht, wie ich auf die schalter reagieren (triggern) kann - muss ich das über einen selektor machen oder gibt es einen anderen weg?

    ursprünglich wurde das vorgeschlagen (ohne den "schalter datenpunkt") - aber das funktioniert nicht

    on({ id: wifiDPs, ack: false }, (dp) => {
        log("yes");
       let wlan_id = dp.id.substring(dp.id.lastIndexOf(".")+1);
       log("State Changed: " + wlan_id);
       setWifi(dp.state.val, wifis[wlan_id].id);
    });
    

    könntet ihr mir da bitte einen tipp geben



  • @AlCalzone @paul53
    ich bräuchte bitte nochmal eure hilfe

    habe problem so gelöst und noch ein detail funktioniert nicht und zwar beim ersten aufruf des scripts:

    die constante ist :

    const wifis = {
       "WLAN_Dragon1": { name: "WLAN_Dragon1", id: "xxxxxxxxxx", desc: "WLAN_Dragon", smart: "WLAN_DragonRoot1" } ,
       "WLAN_DragonGuest": { name: "WLAN_DragonGuest", id: "xxxxxxxxx", desc: "WLAN_DragonGuest", smart: "WLAN_DragoGuest" }
    }
    let wifiDPs = [];
    
    //hier ist eine schleife
     wifiDPs.push(dpPrefix + "WLANUnifi." + wifis[wifi_name].name);
        
    

    der aufruf funktioniert auch - aber das problem ist, er wird gleich mehrmals aufgerufen, wenn das script beim aller erstenmal startet - also setWifi() wird

    on({id: wifiDPs, ack: false, change: "ne"}, function (obj) { 
      var dp2 = obj.name
      setWifi(value, wifis[dp2]);
      dlog(wifis[dp2])
    });
    
    

    hier das log: 6mal aufgerufen

    javascript.2	2019-09-03 11:43:58.777	info	script.js.Armin_Schalter.ALLERLEI.UnifiWLAN3bkpbkp: setWifi: start set Wifi_haupt
    javascript.2	2019-09-03 11:43:58.773	info	script.js.Armin_Schalter.ALLERLEI.UnifiWLAN3bkpbkp: setWifi: start set Wifi_haupt
    javascript.2	2019-09-03 11:43:41.819	info	script.js.Armin_Schalter.ALLERLEI.UnifiWLAN3bkpbkp: setWifi: start set Wifi_haupt
    javascript.2	2019-09-03 11:43:41.819	info	script.js.Armin_Schalter.ALLERLEI.UnifiWLAN3bkpbkp: setWifi: start set Wifi_haupt
    javascript.2	2019-09-03 11:43:41.819	info	script.js.Armin_Schalter.ALLERLEI.UnifiWLAN3bkpbkp: setWifi: start set Wifi_haupt
    javascript.2	2019-09-03 11:43:41.818	info	script.js.Armin_Schalter.ALLERLEI.UnifiWLAN3bkpbkp: setWifi: start set Wifi_haupt
    javascript.2	2019-09-03 11:43:38.646	info	script.js.Armin_Schalter.ALLERLEI.UnifiWLAN3bkpbkp: registered 4 subscriptions and 0 schedules
    

    beim script stoppen und starten ist das nicht der fall



  • hat sich erledigt


Log in to reply
 

Suggested Topics

1.4k
Online

32.6k
Users

39.1k
Topics

530.3k
Posts