[
         {
             "timing": [
                 {
                     "zone": 18.8
                 },
                 {
                     "zone": 17.06,
                 },
                 {
                     "zone": 16.6
                 },
             ]
         },
         {
             "timing": [
                 {
                     "zone": 12.6,
                 },
                 {
                     "zone": 14.6,
                 }
             ]
         },
         {
             "timing": [
                 {
                     "zone":19.06,

                 },{
                     "zone": 8.06,
                 }
             ]
         }
     ]

Hier versuche ich mit einem json Daten mit Javascript zu manipulieren.

Aber ich kann mir keinen Ansatz überlegen, wie ich das erreichen kann.

Ich erwarte unter json. Es gibt Zone1, Zone2, Zone3 gemäß der Zone, die dynamisch sein wird

Bitte schauen Sie unten auf json.

     [
         {
             "zone1": [18.8, 12.6, 19.06 ]
         },{
              "zone2": [17.06, 14.6,  8.06]
         }, {
             "zone3":[16.6]
         }
     ]

Dies ist die Ausgabe von json, wie es aussehen sollte.

Guck dir das mal bitte an

-1
soubhagya pradhan 24 Feb. 2020 im 07:19

5 Antworten

Beste Antwort

Sie können redu und forEach verwenden

  • Durchlaufen Sie die Daten und legen Sie den Anfangswert des OP als Objekt fest
  • Durchlaufen Sie die timing -Eigenschaft jedes Elements und prüfen Sie, ob zone + index + 1 in op vorhanden ist oder nicht. Wenn eine Push-Zone für diesen Schlüssel vorhanden ist, initialisieren Sie den neuen Schlüssel
let data = [{"timing": [{"zone": 18.8},{"zone": 17.06,},{"zone": 16.6},]},{"timing": [{"zone": 12.6,},{"zone": 14.6,}]},{"timing": [{"zone": 19.06,}, {"zone": 8.06,}]}]

let final = data.reduce((op, { timing }) => {
  timing.forEach(({ zone }, i) => {
    let key = `zone${ 1 + i }`
    op[key] = op[key] || []
    op[key].push(zone)
  })
  return op
}, {})

console.log(final)

// If you need final output to be array of object just use entries and map to build a desired output 
console.log(Object.entries(final).map(([k,v])=>({[k]:v})))
4
Code Maniac 24 Feb. 2020 im 04:38
const input =     [ {"timing": [{"zone": 18.8},{"zone": 17.06,},{"zone": 16.6},]},{"timing": [{"zone": 12.6,},{"zone": 14.6,}]},{"timing": [{"zone":19.06,},{"zone": 8.06,}]}]
     
var data = input.map(t => t.timing.map(u => u.zone));
var output = data[0].map((col, i) => data.map(row => row[i])).map((item, index) => {res = {}; res["zone"+(index+1)] = item.filter(t => t!==undefined); return res});
console.log(output);
1
Yosef Tukachinsky 24 Feb. 2020 im 04:40

Hier ist eine mögliche Lösung

var data = [{
    "timing": [{
        "zone": 18.8
      },
      {
        "zone": 17.06,
      },
      {
        "zone": 16.6
      },
    ]
  },
  {
    "timing": [{
        "zone": 12.6,
      },
      {
        "zone": 14.6,
      }
    ]
  },
  {
    "timing": [{
      "zone": 19.06,

    }, {
      "zone": 8.06,
    }]
  }
];

// Calculate the total number of zones
var totalZones = 0;
for (let i = 0; i < data.length; i++) {
  const currZones = data[i].timing.length;
  if (currZones > totalZones) totalZones = currZones;
}
console.log(totalZones);

// Create the final Array
var result = new Array(totalZones);
for (let i = 0; i < totalZones; i++) {
	result[i] = {
  zone: []
  }
}

// Populate the final array with values
for (let i = 0; i < totalZones; i++) {
  for (let j = 0; j < data.length; j++) {
  	let currTiming = data[j].timing[i];
    if (currTiming !== undefined) {
      let currZone = data[j].timing[i].zone;
      if (currZone !== undefined) {
        result[i].zone.push(currZone);
      }
    }
  }
}
console.log(result);
1
Moosa Saadat 24 Feb. 2020 im 04:49

Nicht die kürzeste, aber sehr gut lesbar.

var json = [{"timing": [{"zone": 18.8},{"zone": 17.06,},{"zone": 16.6},]},{"timing": [{"zone": 12.6,},{"zone": 14.6,}]},{"timing": [{"zone": 19.06,}, {"zone": 8.06,}]}];

    
// index 0 is zone1, index 1 is zone2, index 2 is zone3, and so on ...
var zones = [];
    
// Loop through each 'timing' object
json.forEach(function(timingObject) {
  var timing = timingObject['timing'];

  // loop through each 'zone' in the given 'timing' object
  timing.forEach(function(zoneObject, index) {

    var zone = zoneObject['zone'];
    
    // if the zone exists in the zones[] defined above
    // add the current zone to its place
    //
    // if not (else), we have to add the array for the
    // current index, then add the value of the current zone.
    if(zones[index]) {
      zones[index]['zone' + (index + 1)].push(zone);
    } else {
      zones.push({ ['zone' + (index + 1)]: [zone]})
    }
  });
});
    
console.log(zones);
0
bwalshy 24 Feb. 2020 im 04:47

1) Sammeln Sie alle Zonenwerte in einem Array von Arrays
2) Berechnen Sie die maximale Anzahl der für Zonen benötigten Zeilen
3) Haben Sie eine einfache for-Schleife bis max Zeilen und verwenden Sie die Methoden shift und push.

const data = [
  {
    timing: [
      {
        zone: 18.8
      },
      {
        zone: 17.06
      },
      {
        zone: 16.6
      }
    ]
  },
  {
    timing: [
      {
        zone: 12.6
      },
      {
        zone: 14.6
      }
    ]
  },
  {
    timing: [
      {
        zone: 19.06
      },
      {
        zone: 8.06
      }
    ]
  }
];

const zones = data.map(time => time.timing.map(z => z.zone));
const rows = zones.reduce((rows, arr) => Math.max(rows, arr.length), 0);

const all = [];
for (let index = 1; index <= rows; index++) {
  const res = [];
  zones.forEach(zone => zone.length > 0 && res.push(zone.shift()));
  all.push({ [`zone${index}`]: res });
}

console.log(all);
1
Siva Kondapi Venkata 24 Feb. 2020 im 04:56