Я пытаюсь создать другой набор данных на основе значения месяца. Например, за июнь месяц один набор данных и за июль другой набор данных. Но в моем коде все значения месяцев объединяются и создаются как один набор данных.

Будет действительно полезно, кто может помочь мне в создании другого набора данных динамически. Я приложил скрипту, которую я пробовал с моим объектом данных

JSFIDDLE

var obj = [{
    date: "2017-06-01",
    reqC: "129963",
    month: "JUNE",
    resC: "80522"
  }, {
    date: "2017-06-05",
    reqC: "261162",
    month: "JUNE",
    resC: "83743"
  },{
    date: "2017-07-03",
    reqC: "438860",
    month: "JULY",
    resC: "166107"
  }]
  var maindataset = [];
  var dataset = [];
 ["reqC", "resC"].forEach((series) => {
    dataset.push({
      seriesname: series,
      data: obj.map((el) => {
        return el[series]
      })
    })

  });
  maindataset.push({
    dataset: dataset
  });
  alert(JSON.stringify(maindataset));

// Expected Output  

{
  "dataset": [
    {
      "dataset": [                 //June
        {
          "seriesname": "Req",   
          "data": [
            {
              "value": "129963"
            },
            {
              "value": "261162"
            }
          ]
        },
        {
          "seriesname": "Res",
          "data": [
            {
              "value": "80522"
            },
            {
              "value": "83743"
            }
          ]
        }
      ]
    },
    {
      "dataset": [                   //July
        {
          "seriesname": "Req",
          "data": [
            {
              "value": "438860"
            }
          ]
        },
        {
          "seriesname": "Res",
          "data": [
            {
              "value": "166107"
            }
          ]
        }
      ]
    }
  ]
}
1
user4324324 28 Авг 2017 в 11:12

4 ответа

Лучший ответ

Вы можете использовать вложенную хеш-таблицу и позже итерировать ключи для нужных частей.

var data = [{ date: "2017-06-01", reqC: "129963", month: "JUNE", resC: "80522" }, { date: "2017-06-05", reqC: "261162", month: "JUNE", resC: "83743" }, { date: "2017-07-03", reqC: "438860", month: "JULY", resC: "166107" }],
    result = { dataset: [] },
    parts = { reqC: 'Req', resC: 'Res' },
    hash = { _: result.dataset };

data.forEach(function (a) {
    var temp = hash;
    if (!temp[a.month]) {
        temp[a.month] = { _: [] };
        temp._.push({ dataset: temp[a.month]._ });
    }
    temp = temp[a.month];
    Object.keys(parts).forEach(function (k) {
        if (!temp[k]) {
            temp[k] = { _: [] };
            temp._.push({ seriesname: parts[k], data: temp[k]._ });
        }
        temp[k]._.push({ value: a[k] });
    });
});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1
Nina Scholz 28 Авг 2017 в 08:35

Вам также нужно добавить чек на месяц. Попробуй это:

    var obj = [{
    date: "2017-06-01",
    reqC: "129963",
    month: "JUNE",
    resC: "80522"
  }, {
    date: "2017-06-05",
    reqC: "261162",
    month: "JUNE",
    resC: "83743"
  },{
    date: "2017-07-03",
    reqC: "438860",
    month: "JULY",
    resC: "166107"
  }]
  var maindataset = [];

  ["JUNE","JULY"].forEach((month)=>{
  var dataset = [];
     ["reqC", "resC"].forEach((series) => {
      dataset.push({
        seriesname: series,
        data: obj.reduce((filtered, el) => {
          if(el["month"] === month){
           filtered.push({value: el[series]});
           }
           return filtered;
        },[])
      })

    });
    maindataset.push({
      dataset: dataset
    });
  })

  alert(JSON.stringify(maindataset));

Выход:

[{
    "dataset": [{
        "seriesname": "reqC",
        "data": [{
            "value": "129963"
        }, {
            "value": "261162"
        }]
    }, {
        "seriesname": "resC",
        "data": [{
            "value": "80522"
        }, {
            "value": "83743"
        }]
    }]
}, {
    "dataset": [{
        "seriesname": "reqC",
        "data": [{
            "value": "438860"
        }]
    }, {
        "seriesname": "resC",
        "data": [{
            "value": "166107"
        }]
    }]
}]
0
Sach141 28 Авг 2017 в 08:33

Вы можете создавать группы на основе месяца, а затем вы можете вывести желаемую структуру данных. Проверьте фрагмент.

var obj = [{
    date: "2017-06-01",
    reqC: "129963",
    month: "JUNE",
    resC: "80522"
  }, {
    date: "2017-06-05",
    reqC: "261162",
    month: "JUNE",
    resC: "83743"
  },{
    date: "2017-07-03",
    reqC: "438860",
    month: "JULY",
    resC: "166107"
  }];

var result = {};

var groups = obj.reduce(function(acc, obj) {
  acc[obj.month] = acc[obj.month] || [];
  acc[obj.month].push(obj);
  return acc;
}, {});

//console.log(groups);

result.dataset = Object.keys(groups).map(function(key) {
  return {
    dataset: [{
      "seriesname" : "Req",   
      "data": groups[key].map(function(o) {
        return { value : o.reqC };
      })
    }, {
      "seriesname" : "Res",   
      "data": groups[key].map(function(o) {
        return { value : o.resC };
      })
    }]
  };
});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1
abhishekkannojia 28 Авг 2017 в 08:45

Вы не можете использовать одно и то же имя свойства для объекта дважды. У вас есть объект в ваших данных, который выглядит следующим образом:

"data": [
      {
        "value": "80522"
      },
      {
        "value": "83743"
      }
    ]

Либо измените ключи на уникальные:

"data": [
      {
        "value1": "80522"
      },
      {
        "value2": "83743"
      }
    ]

Или сделайте это массивом:

"data": [ "80522", "83743" ]
0
Sventies 28 Авг 2017 в 08:20