Построить массив на основе JSON API-ответа - PullRequest
0 голосов
/ 07 апреля 2020

Ниже приведен JSON ответ от API в angularjs,

{
"counts": 
[
  [
    {
      "xcount": 0.0,
      "ycount": 0.0,
      "month": 4

    },
    {
      "xcount": 0.0,
      "ycount": 0.0,
      "month": 5

    },
    {
      "xcount": 0.0,
      "ycount": 2.85,
      "month": 6
    },
    {
      "xcount": 8.85,
      "ycount": 0.0,
      "month": 6
    },
    {
      "xcount": 10.17,
      "ycount": 0.0,
      "month": 7
    },
    {
      "xcount": 0.0,
      "ycount": 2.85,
      "month": 7
    },
    {
      "xcount": 12.0,
      "ycount": 0.0,
      "month": 8
    },
    {
      "xcount": 0.0,
      "ycount": 2.85,
      "month": 8
    },
    {
      "xcount": 0.0,
      "ycount": 2.85,
      "month": 9
    },
    {
      "xcount": 11.0,
      "ycount": 0.0,
      "month": 9
    }
  ]
]
}

И согласно моему требованию, я хочу получить ответ выше, как показано ниже

{
"counts": 
[
  [
    {
      "xcount": 0.0,
      "ycount": 0.0,
      "month": 4

    },
    {
      "xcount": 0.0,
      "ycount": 0.0,
      "month": 5

    },
    {
      "xcount": 8.85,
      "ycount": 2.85,
      "month": 6
    },

    {
      "xcount": 10.17,
      "ycount": 2.85,
      "month": 7
    },
    {
      "xcount": 12.0,
      "ycount": 2.85,
      "month": 8
    },
    {
      "xcount": 11.0,
      "ycount": 2.85,
      "month": 9
    }
  ]
]

}

Ответы [ 2 ]

2 голосов
/ 07 апреля 2020

var arr = {
  "counts": [
    [{
        "xcount": 0.0,
        "ycount": 0.0,
        "month": 4

      },
      {
        "xcount": 0.0,
        "ycount": 0.0,
        "month": 5

      },
      {
        "xcount": 0.0,
        "ycount": 2.85,
        "month": 6
      },
      {
        "xcount": 8.85,
        "ycount": 0.0,
        "month": 6
      },
      {
        "xcount": 10.17,
        "ycount": 0.0,
        "month": 7
      },
      {
        "xcount": 0.0,
        "ycount": 2.85,
        "month": 7
      },
      {
        "xcount": 12.0,
        "ycount": 0.0,
        "month": 8
      },
      {
        "xcount": 0.0,
        "ycount": 2.85,
        "month": 8
      },
      {
        "xcount": 0.0,
        "ycount": 2.85,
        "month": 9
      },
      {
        "xcount": 11.0,
        "ycount": 0.0,
        "month": 9
      }
    ]
  ]
}

arr.counts[0] = arr.counts[0].reduce((acc, cv, i, arr) => {
  if (!acc[cv.month]) {
    acc[cv.month] = cv;
  } else {
    acc[cv.month].xcount += cv.xcount
    acc[cv.month].ycount += cv.ycount
  }
  if (i === arr.length - 1) {
    return Object.keys(acc).map(key => acc[key])
  } else {
    return acc;
  }
}, {});

console.log(arr.counts[0]);

Используя функцию reduce, мы создаем временный объект, используя номер месяца в качестве ключа. Это позволяет нам отслеживать уникальные записи. Когда мы находим дубликат месяца, мы складываем xcount и ycount вместе. Как только мы достигаем конца списка, мы возвращаем ключи временного объекта, сопоставленные с их значением. Получается список, содержащий только уникальные месяцы.

2 голосов
/ 07 апреля 2020

Как я понял из вашего вопроса, удалить дубликаты месяцев, и если это так, вот мое предложение выше.


Обновление : получил ваше мнение о объединении с помощью xcount, ycount, и добавил необходимые изменения.

var arr = {
    "counts": [
      [
        {
          "month": 4,
          "xcount": 0,
          "ycount": 0
        },
        {
          "month": 5,
          "xcount": 0,
          "ycount": 0
        },
        {
          "month": 6,
          "xcount": 0,
          "ycount": 2.85
        },
        {
          "month": 6,
          "xcount": 8.85,
          "ycount": 0
        },
        {
          "month": 7,
          "xcount": 10.17,
          "ycount": 0
        },
        {
          "month": 7,
          "xcount": 0,
          "ycount": 2.85
        },
        {
          "month": 8,
          "xcount": 12,
          "ycount": 0
        },
        {
          "month": 8,
          "xcount": 0,
          "ycount": 2.85
        },
        {
          "month": 9,
          "xcount": 0,
          "ycount": 2.85
        },
        {
          "month": 9,
          "xcount": 11,
          "ycount": 0
        }
      ]
    ]
  };
  var tmpMonths = [];
  var tmpObjects = {};
  var results = [];
  for (var i=0;i<arr.counts[0].length;i++) {
      var obj = arr.counts[0][i];
      var key = "month_" + obj.month;
      if (obj.month && tmpMonths.indexOf(obj.month)===-1) {
          
          tmpMonths.push(obj.month);
          tmpObjects[key] = obj;
          results.push(obj);
      } else {
          tmpObjects[key] = {
              month: obj.month,
              xcount: obj.xcount + tmpObjects[key]["xcount"],
              ycount: obj.ycount + tmpObjects[key]["ycount"],
          };
      }
  }
  arr.counts[0] = Object.values(tmpObjects);
  console.log(JSON.stringify(arr));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...